2012-03-12 2 views
5

Как выполнить запрос, как показано ниже, с помощью JPA. (Он работает с простой SQL)Запрос JPA с CASE WHEN в предложении WHERE. Как сделать?

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)

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

+0

Почему вы не нарушаете свое состояние в некоторых условиях с помощью AND и OR? –

ответ

8

Вы можете конвертировать ваши, где положение, чтобы что-то вроде:

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 :: = {ПРИМЕР when_clause when_clause} * ИНАЧЕ scalar_expression КОНЕЦ
  • 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), я боюсь.

1

Вы можете загрузить 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.

Смежные вопросы