2012-03-12 18 views
5

¿Cómo se puede ejecutar una consulta como la siguiente con JPA. (Funciona con SQL sin formato)Consulta de JPA con CASO CUANDO en la cláusula WHERE. ¿Cómo hacer?

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

me siento un MismatchedTokenException en IS

THEN (t.category IS NULL)

¿Es posible? ¿O necesito volver a escribir esta consulta?

+0

¿Por qué no se rompe su condición en algunas condiciones con AND y OR? –

Respuesta

8

Puede convertir su cláusula where a algo como:

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

Creo que no puedes hacer eso. Lea el JPQL grammar (aquí cortesía de OpenJPA). Aquí están los términos que definen la expresión de caso, específicamente la expresión de caso general que está utilizando:

  • case_expression :: = general_case_expression | simple_case_expression | coalesce_expression | nullif_expression
  • general_case_expression :: = {CASO when_clause when_clause} * ELSE scalar_expression FIN
  • when_clause :: = CUANDO ENTONCES conditional_expression scalar_expression

La expresión en el lado derecho de la THEN tiene que ser un scalar_expression . Es decir:

  • escalar_expresión :: = arithmetic_expression | string_primary | enum_primary | datetime_primary | boolean_primary | case_expression | entity_type_expression

No he enraizado la definición de todos esos términos, pero creo que no incluyen cosas como (t.category IS NULL), me temo.

1

Puede descargar la especificación 2.0 APP versión final desde aquí: http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/

Debe comprobar Ejemplo 6 en la sección 6.5 .7. Muestra cómo usar case-when en Criteria API. No estoy seguro, pero creo que es posible usar expresiones lógicas (t.category IS NULL) en el bloque THEN si lo usa en una cláusula WHERE.