2012-03-12 33 views
5

JPAで以下のようなクエリを実行するにはどうすればいいですか? (それは、プレーンなSQLで動作します)WHERE句にCASE WHENを含むJPAクエリ。実行する方法?

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

は私がIS

THEN (t.category IS NULL)

MismatchedTokenExceptionを取得するには、それは可能ですか?またはこのクエリを書き直す必要がありますか?

+0

あなたの条件をANDとORでいくつかの条件に分解してみませんか? –

答えて

8

あなたは、変換することができ、あなたの場所のようなものに句:あなたがここからJPA 2.0仕様の最終リリースをダウンロードすることができます

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

私はあなたがそれをすることはできないと思います。 JPQL grammarを読んでください(ここではOpenJPAを提供しています)。以下に、ケース式を定義する用語、具体的には使用している一般的なケース式を示します。

  • case_expression :: = general_case_expression | simple_case_expression | coalesce_expression | nullif_expression
  • general_case_expression :: = CASE when_clause {when_clause} * ELSE scalar_expression端
  • when_clause :: = conditional_expression次いでTHENの右側の式はscalar_expressionなければならscalar_expression

WHEN 。すなわち、

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

は私がすべてのそれらの用語の定義によって根付いていないが、私は彼らが(t.category IS NULL)のようなものが含まれていないと思いますが、私は怖いです。

1

:あなたは例6セクション6.5をチェックする必要があります http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/

.7。 Criteria APIでcase-whenを使用する方法を示します。 私は確信していませんが、WHERE節でそれを使用すると、論理式(t.category IS NULL)をTHENブロックに使用することが可能だと思います。