【问题标题】:How to create OrderSpecifier in QueryDSL for TIME difference?如何在 QueryDSL 中为时差创建 OrderSpecifier?
【发布时间】:2019-09-11 10:27:27
【问题描述】:

我想创建一个 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() 方法当然不存在。但是我怎样才能做到这一点呢?

当然不需要以分钟计算差异。我只想说明这 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]

那么我怎样才能在querydsl中使用TIMEDIFF函数呢?

【问题讨论】:

    标签: java mysql querydsl


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-15
      • 2016-10-10
      • 2013-12-04
      • 1970-01-01
      • 2017-12-03
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      相关资源
      最近更新 更多