[英]Does JPQL support the use of a boolean result in another expression?
我正在嘗試編寫一個查詢來支持搜索 API。 特別是對於標志searchDrafts
- 如果標志為true
,我必須獲取status
為DRAFT
的行,否則我必須獲取具有除DRAFT
之外的任何status
的所有行。
在常規 SQL 中,以下查詢工作正常:
SELECT id, status
FROM records
where ((status = 'DRAFT') = :searchDrafts);
但是,JPQL 中的類似事情不起作用:
SELECT r
FROM Records r
WHERE ((r.status = 'DRAFT') = :searchDrafts);
它給出了錯誤:
unexpected AST node: = near line 1, column nn
JPQL 中是否有任何方法可以將 boolean 的值用於另一個表達式?
另一種方法是用更長的方式來做,但有點冗長。 這在 JPQL 中運行良好:
SELECT id, status
FROM records
where (:searchDrafts=true AND (status = 'DRAFT'))
or (:searchDrafts=false AND (status != 'DRAFT'));
Jakarta Persistence 3.0 規范中的 JPQL 語法不允許這樣做。 (我手頭有 3.0,但我不希望早期的有所不同。) Boolean 比較對應於這個生產規則:
comparison_expression ::=
...
boolean_expression {= | <>} {boolean_expression | all_or_any_expression} |
...
然后comparison_expression
僅作為conditional_expression
生產規則的一部分遇到:
conditional_expression ::= conditional_term | conditional_expression OR conditional_term
conditional_term ::= conditional_factor | conditional_term AND conditional_factor
conditional_factor ::= [NOT] conditional_primary
conditional_primary ::= simple_cond_expression | (conditional_expression)
simple_cond_expression ::=
comparison_expression |
...
而conditional_expression
直接出現在WHEN
、 WHERE
、 HAVING
和ON
子句中。 這意味着boolean_expression
comparison_expression
除了您使用AND
的解決方案之外,這個似乎也可以:
SELECT r
FROM Records r
WHERE CASE WHEN r.status = 'DRAFT' THEN TRUE ELSE FALSE END = :searchDrafts;
它非常難看,但它確實將conditional_expression
轉換為boolean_expression
。
實際上,您最好有兩個不同的查詢:一個用於“=”,另一個用於“<>”。
總的來說,感覺像是 JPA 標准中的一個遺漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.