JPQL 语句返回布尔值

Posted

技术标签:

【中文标题】JPQL 语句返回布尔值【英文标题】:JPQL statement returning boolean value 【发布时间】:2012-08-16 14:29:39 【问题描述】:

是否可以编写如下 JPQL 查询:

select count(*) > 0 from Scenario scen where scen.name = :name

这将根据实体填充标准是否存在而返回真/假布尔值?

我想这样使用查询:

boolean exists = entityManager.createQuery(query,Boolean.class).setParameter("name",name).getSingleResult();

我的示例中的查询在语法上不正确(解析错误),但是是否有任何正确的方法可以像在 JPQL 中那样进行检查,返回布尔值,还是只能在 Java 代码中使用?

【问题讨论】:

SELECT NEW java.lang.Boolean(count(*) > 0) 应该可以工作。也许你可以省略包声明,我现在没有机会尝试。 奇怪,但我收到以下错误:org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [java.lang.Boolean] [select new java.lang.Boolean(count(*) > 0) from ... 所以尝试确定这个查询返回什么——我的意思是尝试Object exists = entityManager.createQuery(...,然后在调试模式下查看存在什么类型和值的对象 【参考方案1】:

是的,可以通过以下方式实现:

select case when (count(scen) > 0)  then true else false end  
from Scenario scen where scen.name = :name

【讨论】:

其实这个说法HQL有效,JPQL无效。 @Oleksandr Bondarenko,可以,但不幸的是我无法识别为什么它不是有效的 JQPL,你能解释一下吗? 抱歉,这是一个有效的 JPQL,在 JPA 1.0 中无效。 这个QUERY返回Integer而不是Boolean是否正常? 我使用答案中的确切语法将它用作 Spring Data JPA 存储库上的 @Query 注释。【参考方案2】:

刚刚呢:

select count(scen) > 0
from Scenario scen where scen.name = :name

【讨论】:

即使使用当前的 Hibernate 5.2.12,此语句也不适用于所有数据库。它适用于 H2,但不适用于 MSSQL,而是“当时的情况..”适用于两个(希望是所有)数据库 我认为大多数项目永远不会从其他表迁移到 MSSQL) :) Hibernate 恕我直言,最容易被误解、被炒作的“功能”之一。您永远不会在没有任何彻底的迁移计划和代码更改的情况下交换您的企业数据库,至少在任何合理规模的项目中都不会。如果有人真的想从 Postgres 切换到 M$SQL,无论如何你都必须测试你的代码库。修复查询并完成它。只是不要从一开始就编写复杂的查询,只是因为你可能将来某个时候需要它(你永远不会!) IntelliJ IDEA 抱怨 > 运算符,直到我在比较中加上括号:(count(scen) > 0) @JensPiegsa 我认为他们现在解决了这个问题,它可以在没有括号的情况下使用【参考方案3】:

我遇到了同样的问题,然后我将休眠更新到 4.3.11.Final,现在它可以正常工作了。

【讨论】:

以上是关于JPQL 语句返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 if 语句不返回布尔值?

在 SQL Select 语句上返回布尔值

返回的布尔值转换为布尔值

检查数组中的所有值是不是为真,然后返回一个真布尔语句(javascript)[重复]

Lua,if语句成语无法返回正确的布尔值

我的咖啡脚本中的条件语句在应该返回一个数字时返回一个布尔值[重复]