Запрос 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
предложения.