嵌套逻辑运算符的 JPA NamedQueries 问题
JPA NamedQueries problem with nested logical operator
我有以下问题。我想在我的 table 中过滤一个列,要么为真,要么为假,然后只给我日期大于 xxx 的条目。所以基本上 return 我每个客户都是有效客户, return 所有客户都是无效的并且激活日期大于 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
我已经尝试过调整支架位置。
有人对我有类似的问题或解决方法吗?
您可能需要在 WHERE 子句之前放置一个 space,否则您的字符串将不是有效的 JPQL:
"SELECT c FROM CustomerBE cWHERE (c.isCustomer= true) O ..."
我不确定这是否是您报告的问题,但这也是一个需要修复的问题。
好的,现在修复它。问题是 postgre 部分“CURRENT_DATE + INTERVAL '3.5 years'” 必须用 :filterDate 替换它并通过参数设置它。
我有以下问题。我想在我的 table 中过滤一个列,要么为真,要么为假,然后只给我日期大于 xxx 的条目。所以基本上 return 我每个客户都是有效客户, return 所有客户都是无效的并且激活日期大于 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
我已经尝试过调整支架位置。 有人对我有类似的问题或解决方法吗?
您可能需要在 WHERE 子句之前放置一个 space,否则您的字符串将不是有效的 JPQL:
"SELECT c FROM CustomerBE cWHERE (c.isCustomer= true) O ..."
我不确定这是否是您报告的问题,但这也是一个需要修复的问题。
好的,现在修复它。问题是 postgre 部分“CURRENT_DATE + INTERVAL '3.5 years'” 必须用 :filterDate 替换它并通过参数设置它。