【问题标题】:QueryDSL CaseBuilder does not work with java.util.DateQueryDSL CaseBuilder 不适用于 java.util.Date
【发布时间】:2021-05-08 06:11:31
【问题描述】:

当我这样做时,我收到错误java.lang.IllegalArgumentException: Unsupported constant Mon Mar 01 00:00:00 GMT 2021

DateTimeExpression<Date> startOfMonth = new CaseBuilder()
            .when(order.dueDate.lt(day))
            .then(new Date())
            .otherwise(new Date());

看起来像一个简单的查询。我不明白出了什么问题。

我正在使用 QueryDSL 3.6、Hibernate 5.1 和 Postgres 10。

【问题讨论】:

    标签: hibernate querydsl


    【解决方案1】:

    问题在于 JPQL/HQL 不允许在 CASE WHEN 表达式中使用参数。您必须用文字替换常量。类似于以下内容:

    .when(order.dueDate.lt(Expressions.templateExpression(Date.class, "'2021-01-01 00:00:00'"))
    

    “THEN”和“ELSE”表达式中的常量应该没问题。

    【讨论】:

    • 如果我这样做,我会收到错误“错误:运算符不存在:没有时区的时间戳 >= 文本”。如果我添加类型转换,我会收到错误“org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌::第 6 行附近”
    • 您需要使用 JPQL 转换而不是 SQL 转换。也许Expressions.dateOperation(Date.class, JPQLOps.CAST, Expressions.stringTemplate("'2020-01-01'"), Expressions.constant(Date.class))
    • 如果我这样做,我会收到错误 HHH000183: no persistent classes found for query class:
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多