2013-12-20 68 views
1

以下JPQL查詢,而不問題上運行:JPQL: 「where」 子句中的 「案例」 變量

SELECT t, CASE WHEN (e.language.language = 'en' AND e.language.country = 'GB' AND e.language.variant = '') THEN e.text ELSE '' END sortProperty FROM Glossary g JOIN g.terms t JOIN t.expressions e ORDER BY sortProperty 

,而下面的失敗:

SELECT t, CASE WHEN (e.language.language = 'en' AND e.language.country = 'GB' AND e.language.variant = '') THEN e.text ELSE '' END sortProperty FROM Glossary g JOIN g.terms t JOIN t.expressions e WHERE sortProperty = 'asdf' ORDER BY sortProperty 

與此異常:

Caused by: java.lang.IllegalArgumentException: Invalid unbound variable "sortproperty" in query. 

這是查詢語法的一個限制,可以以某種方式繞過(可能使用Criteria API)?

感謝和問候, 帕斯卡

+0

你確定你沒有忘記使用setParameter(「sortproperty」,sortproperty)?? –

+0

@sabujhassan Thx爲您的迴應。 sortProperty雖然不是一個參數,但是是一個結果變量。 –

回答

2

問題不具有(在這種情況下sortProperty)直接連接到CASE表達,在一般的結果變量不能在WHERE子句中使用。這就是爲什麼也是繼無效JPQL:

SELECT u.firstName AS someVar FROM User u WHERE someVar = 'blaa' 

標準API不幫助這裏。 SQL中也存在類似的限制:

SELECT u.first_name as someAlias 
FROM users u 
-- someAlias is not known here: 
WHERE someAlias = 'blaa' 

整個條件應該推到WHERE子句。

+0

謝謝@ mikko-manu。我能夠將條件從CASE表達式移至WHERE子句。 –