我正在嘗試撰寫一個查詢來支持搜索 API。特別是對于標志searchDrafts- 如果標志是true我必須獲取行,status DRAFT否則我必須獲取status除DRAFT.
在常規 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 有沒有辦法在另一個運算式中使用布爾結果的值?
另一種方法是用更長的時間來做,但它有點冗長。這在 JPQL 中作業正常:
SELECT id, status
FROM records
where (:searchDrafts=true AND (status = 'DRAFT'))
or (:searchDrafts=false AND (status != 'DRAFT'));
uj5u.com熱心網友回復:
Jakarta Persistence 3.0 規范中的 JPQL 語法不允許這樣做。(我手頭有 3.0,但我不希望早期版本有所不同。)布爾比較對應于這個產生式規則:
comparison_expression ::=
...
boolean_expression {= | <>} {boolean_expression | all_or_any_expression} |
...
thencomparison_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條款。這意味著comparison_expression不能是boolean_expression.
除了你的解決方案AND,這個似乎也有效:
SELECT r
FROM Records r
WHERE CASE WHEN r.status = 'DRAFT' THEN TRUE ELSE FALSE END = :searchDrafts;
它非常丑陋,但它確實將 a 轉換conditional_expression為 a boolean_expression。
在實踐中,您最好有兩個不同的查詢:一個用于“=”,另一個用于“<>”。
總的來說,感覺像是 JPA 標準中的一個遺漏。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386170.html
