2012-03-12 12 views
5

Come può eseguire una query come di seguito con JPA. (Funziona con SQL pianura)Query JPA con CASO QUANDO nella clausola WHERE. Come fare?

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

ottengo un MismatchedTokenException a IS

THEN (t.category IS NULL)

è possibile? O ho bisogno di riscrivere questa query?

+0

Perché non rompere le condizioni in alcune condizioni con AND e OR? –

risposta

8

È possibile convertire la clausola WHERE a qualcosa di simile:

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

Penso che tu non possa farlo. Leggere il numero JPQL grammar (qui per gentile concessione di OpenJPA). Ecco i termini che definiscono l'espressione del caso, in particolare l'espressione del caso generale che stai utilizzando:

  • 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 :: = QUANDO conditional_expression ALLORA scalar_expression

L'espressione sul lato destro del THEN deve essere un scalar_expression . Vale a dire:

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

Non ho radicato la definizione di tutti quei termini, ma penso che non includano cose come (t.category IS NULL), temo.

1

È possibile scaricare l'APP specifiche 2.0 release finale da qui: http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/

Si dovrebbe controllare Esempio 6 in sezione 6.5 .7. Mostra come utilizzare case-when in Criteria API. Non sono sicuro, ma penso che sia possibile utilizzare le espressioni logiche (t.category IS NULL) nel blocco THEN se lo si utilizza in una clausola WHERE.

Problemi correlati