[英]Spring Boot+JPA+QueryDSL=OrderSpecifier not found
[英]How to create OrderSpecifier in QueryDSL for TIME difference?
我想创建一个querydsl
OrderSpecifier
表达式,该表达式按两个sql TIME
值的分钟差OrderSpecifier
:
@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()
方法不存在。 但是我该如何实现呢?
当然,不需要以分钟为单位计算差异。 我只想将这2次自上而下排序之间的最大差异。
我尝试如下,但遇到异常:
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]
那么,如何在TIMEDIFF
使用TIMEDIFF
函数呢?
尽管我希望有一个更简单的解决方案,但仍可以进行以下工作:
Expressions.timeTemplate(Integer.class, "TIMEDIFF({0}, {1})", Arrays.asList(QStock.stock.time1, QStock.stock.time2));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.