2012-03-12 19 views
5

JPA ile aşağıdaki gibi bir sorguyu nasıl çalıştırabilirsiniz. JPA WHERE maddesinde CASE WHEN sorgusu var. Nasıl yapılır?

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

Ben IS

THEN (t.category IS NULL)

mümkün mü bir MismatchedTokenException almak (O sade SQL ile çalışır)? Veya bu sorguyu yeniden yazmam gerekiyor mu?

+0

Neden durumunuzu AND ve OR ile bazı koşullara ayırmıyorsunuz? –

cevap

8

Sen dönüştürebilirsiniz senin nerede böyle bir şey için fıkra: buradan JPA 2.0 spesifikasyonu son sürümümüze

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

Sanırım bunu yapamazsınız. JPQL grammar'u (burada OpenJPA'nın izniyle) okuyun. Burada, özellikle ifade ettiğiniz genel durum ifadesini tanımlayan terimler şunlardır:

  • case_expression :: = general_case_expression | simple_case_expression | coalesce_expression | nullif_expression
  • general_case_expression :: = Olgu when_clause {when_clause} * BAŞKA scalar_expression END
  • :: = conditional_expression SONRA scalar_expression
THEN sağ tarafındaki ifade sahip

bir scalar_expression olmak ZAMAN when_clause . Demek ki:

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

Tüm bu terimlerin tanımı yoluyla köklü değil, ama ben korkuyorum, onlar (t.category IS NULL) gibi şeyler içermez düşünüyorum.

İlgili konular