gpt4 book ai didi

java - 如何在 QueryDSL 中为时间差创建 OrderSpecifier?

转载 作者:行者123 更新时间:2023-11-29 15:38:56 25 4
gpt4 key购买 nike

我想创建一个 querydsl OrderSpecifier 表达式,该表达式按两个 SQL TIME 值的分钟差进行排序:

@Generated
public class QStock extends EntityPathBase<Stock> {
public final TimePath<java.time.LocalTime> time1 = createTime(..);
public final TimePath<java.time.LocalTime> time2 = createTime(..);
}

伪代码:

QStock.stock.time1.minutesTo(QStock.stock.time2).desc();

当然,minutesTo() 方法不存在。但我怎样才能实现这个目标呢?

当然没必要以分钟来计算差异。我只想将这两次自上而下排序之间的最大差异放在一起。

我尝试如下,但出现异常:

Expressions.numberOperation(Integer.class, Ops.DateTimeOps.DIFF_MINUTES, QStock.stock.time1, QStock.stock.time2)


Caused by: java.sql.SQLSyntaxErrorException: (conn=1326) FUNCTION table.diff_minutes does not exist
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:236) ~[mariadb-java-client-2.3.0.jar:?]
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:165) ~[mariadb-java-client-2.3.0.jar:?]

所以我尝试将 TIMEDIFF 函数字符串显式添加到 querydsl:

//inspired by Ops.DateTimeOps
enum MysqlDateTimeOps implements Operator {
TIMEDIFF(Comparable.class);

private final Class<?> type;

MysqlDateTimeOps(Class<?> type) {
this.type = type;
}

@Override
public Class<?> getType() {
return type;
}
}

使用:

Expressions.numberOperation(Integer.class, MysqlDateTimeOps.TIMEDIFF, QStock.stock.time1, QStock.stock.time2)

结果:

org.springframework.dao.InvalidDataAccessApiUsageException: No pattern found for TIMEDIFF; nested exception is java.lang.IllegalArgumentException: No pattern found for TIMEDIFF
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:373) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) ~[spring-tx-5.1.9.RELEASE.jar:5.1.9.RELEASE]

那么如何在 querydsl 中使用 TIMEDIFF 函数呢?

最佳答案

以下工作,但我希望有一个更简单的解决方案:

Expressions.timeTemplate(Integer.class, "TIMEDIFF({0}, {1})", Arrays.asList(QStock.stock.time1, QStock.stock.time2));

关于java - 如何在 QueryDSL 中为时间差创建 OrderSpecifier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57887124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com