簡體   English   中英

在WHERE子句中使用CASE WHEN進行JPA查詢。 怎么做?

[英]JPA query with CASE WHEN in the WHERE clause. How to do?

如何使用JPA運行如下所示的查詢。 (它適用於純SQL)

SELECT t
FROM table t
WHERE
  (
    CASE WHEN (( ... subquery ... )  IS NULL)
    THEN (t.category IS NULL)
    ELSE (t.viewId = :viewId)
    END
  )

我在IS遇到MismatchedTokenException

THEN (t.category IS NULL)

可能嗎? 或者我需要重寫這個查詢?

您可以將where子句轉換為:

where
    ((... my first condition ...) and (something is NULL))
    or
    (not (... first condition ...) and (something2 = otherthing))

我想你不能這樣做。 閱讀JPQL語法 (這里是OpenJPA提供的)。 以下是定義案例表達式的術語,特別是您正在使用的一般案例表達式:

  • case_expression :: = general_case_expression | simple_case_expression | coalesce_expression | nullif_expression
  • general_case_expression :: = CASE when_clause {when_clause} * ELSE scalar_expression END
  • when_clause :: = WHEN conditional_expression THEN scalar_expression

THEN右側的表達式必須是scalar_expression 這就是說:

  • scalar_expression :: = arithmetic_expression | string_primary | enum_primary | datetime_primary | boolean_primary | case_expression | entity_type_expression

我沒有根除所有這些術語的定義,但我認為它們不包括像(t.category IS NULL)這樣的東西,我很害怕。

您可以從此處下載JPA 2.0規范最終版本: http//download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/

您應該查看6.5.7節中的 示例6 它顯示了如何在Criteria API中使用case-when 我不確定,但我認為如果你在WHERE子句中使用它,可以在THEN塊中使用邏輯表達式( t.category IS NULL )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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