JPA запрос с CASE WHEN в предложении WHERE. Как сделать? - PullRequest
6 голосов
/ 12 марта 2012

Как выполнить запрос, как показано ниже, с помощью JPA. (Работает с простым SQL)

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

Я получаю MismatchedTokenException на IS

THEN (t.category IS NULL)

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

Ответы [ 3 ]

10 голосов
/ 13 марта 2012

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

where
    ((... my first condition ...) and (something is NULL))
    or
    (not (... first condition ...) and (something2 = otherthing))
2 голосов
/ 12 марта 2012

Я думаю, ты не можешь этого сделать. Прочитайте 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 :: = WHEN условие_экспрессии 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), я боюсь.

1 голос
/ 21 октября 2013

Вы можете скачать финальную версию спецификации JPA 2.0 здесь: http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/

Вы должны проверить Пример 6 в разделе 6.5.7 . Он показывает, как использовать case-when в Criteria API. Я не уверен, но я думаю, что можно использовать логические выражения (t.category IS NULL) в блоке THEN, если вы используете его в предложении WHERE.

...