Jpa JPQL:";其中;关于「;案例;变量

Jpa JPQL:";其中;关于「;案例;变量,jpa,case,jpql,Jpa,Case,Jpql,以下JPQL查询运行时没有问题: 选择t,CASE WHEN(e.language.language='en'和e.language.country='GB'和e.language.variant=''),然后e.text ELSE''从词汇表g JOIN g.terms t JOIN t.expressions e ORDER BY sortProperty结束sortProperty 鉴于以下情况不适用: 选择t,当(e.language.language='en'和e.language.

以下JPQL查询运行时没有问题:

选择t,CASE WHEN(e.language.language='en'和e.language.country='GB'和e.language.variant=''),然后e.text ELSE''从词汇表g JOIN g.terms t JOIN t.expressions e ORDER BY sortProperty结束sortProperty
鉴于以下情况不适用:

选择t,当(e.language.language='en'和e.language.country='GB'和e.language.variant='')然后e.text ELSE''从词汇表g结束sortProperty g JOIN g.terms t JOIN t.expressions e其中sortProperty='asdf'按sortProperty排序
除此之外:

Caused by: java.lang.IllegalArgumentException: Invalid unbound variable "sortproperty" in query.
这是查询语法中的一个限制吗?是否可以通过某种方式避免(可能使用CriteriaAPI)

谢谢并致以最良好的祝愿,
Pascal

问题与
CASE
表达式没有直接关系,一般情况下,
WHERE
子句中不能使用结果变量(本例中为sortProperty)。这就是为什么以下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子句。

您确定没有忘记使用setParameter(“sortproperty”,sortproperty)??@sabujhassan Thx作为您的响应。sortProperty不是一个参数,而是一个结果变量。谢谢@mikko manu。我能够将条件从CASE表达式移动到WHERE子句。