我尝试运行一个查询,检查某些条件是否为真,并返回一个简单的布尔结果作为输出。稍微有点棘手的是,其中一个条件是测试是否没有结果返回一组条件。
我目前使用JPA-2.0,以Hibernate作为我的提供程序,并由MySQL支持。我已经得到了一个示例查询,它在MySQL中运行良好,但当尝试在JPQL中运行它时,它失败了。MySQL查询看起来有点像这样:
Select exists(Select statement with criteria)
or not exists(Select statement with criteria);
我也使用CASE得到了相同的输出,但JPQL不支持该语句。
无论如何,当我尝试在JPQL中使用类似的查询时,我得到了错误:
“子树意外结束”
从我的理解来看,这意味着查询中缺少了一些东西。有人知道如何修复它吗?
7条答案
按热度按时间li9yvcax1#
可以使用case表达式执行布尔查询。
从JPA 2.0(Java EE 6)开始,您可以创建TypedQuery。
在JPA 1.0(Java EE 5)中,必须使用非类型化查询。
lxkprmvk2#
此答案已过时,有可能,请参考Rene Link的正确答案
不,这不可能。
参考Oracle的JPQL BNF文档。
simple_cond_expression::= comparison_expression|间表达式|相似表达式|在表达式中|空比较表达式|空集合比较表达式|集合成员表达式|exists_expression
exists_expression::= [NOT] EXISTS(子查询)
hzbexzde3#
在一个使用Hibernate 5.2(支持JPA 2.1)和Spring Data Jpa 2.0.6的项目中,我成功地使用了这个JPQL查询:
在日志中,我看到生成的原生查询如下:
ql3eal8s4#
或者,你可以使用一个
select count(...)
并测试它是否返回0
。这应该是几乎一样高效,而不需要编写更多的代码(事实上,查询本身可能看起来更简单)。flmtquvp5#
您有不匹配的方括号。请尝试删除
not
之前的方括号(第一个方括号周围的方括号存在):exists()
周围不需要括号ubbxdtey6#
在一个使用
我成功地使用了一个
子句。所以它可能已经改变了。它也可能是Hibernate专有的。因为很多人使用Hibernate作为持久性提供程序,我想我可能会在这里添加这个。
z4bn682m7#
对于数据库来说,不计算所有记录会更高效。
Spring-Data-JPA
或JPA: