【问题标题】:JPA NamedQueries problem with nested logical operator嵌套逻辑运算符的 JPA NamedQueries 问题
【发布时间】:2021-12-01 18:03:57
【问题描述】:

我有以下问题。我想过滤我表中的一列是否为真或如果为假,则只给我日期大于 xxx 的条目。因此,基本上将每个有效客户返回给我,并返回所有无效且激活日期大于 3.5 年的客户。

name is_customer activation_date
Pete True 2021.02.02
Sam False 2021.02.02

我在我的 psql 控制台中尝试了查询,一切正常。但是,当我尝试将其调整为在我的 JPA 实体中与 @NamedQueries 一起使用时,无法验证查询(无论是在 Intellij 中还是在运行代码时)。

在 Postgres 中查询(工作正常):

SELECT * FROM customer c
WHERE (c.is_customer = true) OR (c.is_customer = false AND c.activation_date >  CURRENT_DATE + INTERVAL '3.5 years');

用 Java 查询(不工作):

@NamedQuery(name = CustomerBE.NAMED_QUERY,
                query = "SELECT c FROM CustomerBE c "
                       + "WHERE (c.isCustomer= true) OR (c.isCustomer= false AND c.activationDate > CURRENT_DATE + INTERVAL '3.5 years')"
)

Intellij 错误:'(', <expression> or identifier expected, got '('

JPQL 错误:

Exception Description: Syntax error parsing [SELECT c FROM CustomerBE c WHERE (c.isCustomer= true) OR (c.isCustomer= false AND c.activationDate > CURRENT_DATE + INTERVAL '3.5 years']. 
[41, 297] The expression is not a valid conditional expression.
[297, 298] The query contains a malformed ending

我已经尝试过调整支架的位置。 有人可能对我有类似的问题或解决方法吗?

【问题讨论】:

    标签: java postgresql jpa jpql


    【解决方案1】:

    您可能需要在 WHERE 子句之前放置一个空格,否则您的字符串将不是有效的 JPQL:

    “SELECT c FROM CustomerBE cWHERE (c.isCustomer= true) O ...”

    我不确定这是否是您报告的问题,但这也是一个需要修复的问题。

    【讨论】:

      【解决方案2】:

      好的,现在修好了。问题是 postgre 部分 "CURRENT_DATE + INTERVAL '3.5 years'" 必须用 :filterDate 替换它并通过参数设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 2013-11-01
        相关资源
        最近更新 更多