Запрос JPA с CASE WHEN в предложении WHERE. Как это сделать?

как можно запустить запрос, как показано ниже, с JPA. (Он работает с простым SQL)

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

Я MismatchedTokenException at IS

THEN (t.category IS NULL)

это возможно? Или мне нужно переписать этот запрос?

3 ответов


вы можете преобразовать предложение where в что-то вроде:

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

Я думаю, вы не можете этого сделать. Прочтите грамматика JPQL (здесь любезно предоставлено OpenJPA). Вот термины, определяющие выражение case, в частности общее выражение case, которое вы используете:

  • 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 ::= когда conditional_expression затем 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 на 6.5.7. Он показывает, как использовать case-when в API критериев. Я не уверен, но я думаю, что можно использовать логические выражения (t.category IS NULL) в THEN блок, если вы используете его в WHERE предложения.