簡體   English   中英

JPQL 是否支持使用 boolean 導致另一個表達式?

[英]Does JPQL support the use of a boolean result in another expression?

我正在嘗試編寫一個查詢來支持搜索 API。 特別是對於標志searchDrafts - 如果標志為true ,我必須獲取statusDRAFT的行,否則我必須獲取具有除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直接出現在WHENWHEREHAVINGON子句中。 這意味着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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM