2013-12-20 61 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子句。 –