jpa 在JPQL中是否可以使用Select EXISTS()?

vof42yt1  于 2023-03-30  发布在  其他
关注(0)|答案(7)|浏览(225)

我尝试运行一个查询,检查某些条件是否为真,并返回一个简单的布尔结果作为输出。稍微有点棘手的是,其中一个条件是测试是否没有结果返回一组条件。
我目前使用JPA-2.0,以Hibernate作为我的提供程序,并由MySQL支持。我已经得到了一个示例查询,它在MySQL中运行良好,但当尝试在JPQL中运行它时,它失败了。MySQL查询看起来有点像这样:

Select exists(Select statement with criteria) 
  or not exists(Select statement with criteria);

我也使用CASE得到了相同的输出,但JPQL不支持该语句。
无论如何,当我尝试在JPQL中使用类似的查询时,我得到了错误:
“子树意外结束”
从我的理解来看,这意味着查询中缺少了一些东西。有人知道如何修复它吗?

li9yvcax

li9yvcax1#

可以使用case表达式执行布尔查询。
从JPA 2.0(Java EE 6)开始,您可以创建TypedQuery。

String query = "select case when (count(*) > 0)  then true else false end from ......"
TypedQuery<Boolean> booleanQuery = entityManager.createQuery(query, Boolean.class);
boolean exists = booleanQuery.getSingleResult();

在JPA 1.0(Java EE 5)中,必须使用非类型化查询。

Query booleanQuery = entityManager.createQuery(query);
boolean exists = (Boolean) booleanQuery.getSingleResult();
lxkprmvk

lxkprmvk2#

此答案已过时,有可能,请参考Rene Link的正确答案

不,这不可能。
参考Oracle的JPQL BNF文档。

simple_cond_expression::= comparison_expression|间表达式|相似表达式|在表达式中|空比较表达式|空集合比较表达式|集合成员表达式|exists_expression
exists_expression::= [NOT] EXISTS(子查询)

hzbexzde

hzbexzde3#

在一个使用Hibernate 5.2(支持JPA 2.1)和Spring Data Jpa 2.0.6的项目中,我成功地使用了这个JPQL查询:

@Query("SELECT COUNT(c) > 0 FROM Contract c WHERE c.person.id = :pid")
Boolean existContractForPerson(@Param("pid") Long personId);

在日志中,我看到生成的原生查询如下:

select count(contract0_.contract_id)>0 as col_0_0_ from contracts contract0_ where contract0_.fk_person_id=?
ql3eal8s

ql3eal8s4#

或者,你可以使用一个select count(...)并测试它是否返回0。这应该是几乎一样高效,而不需要编写更多的代码(事实上,查询本身可能看起来更简单)。

flmtquvp

flmtquvp5#

您有不匹配的方括号。请尝试删除not之前的方括号(第一个方括号周围的方括号存在):

select exists(Select statement with criteria) 
  or not exists(Select statement with criteria);

exists()周围不需要括号

ubbxdtey

ubbxdtey6#

在一个使用

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.2.4.Final</version>
    </dependency>
    ...

我成功地使用了一个

exists(select s.primaryKey from Something s)

子句。所以它可能已经改变了。它也可能是Hibernate专有的。因为很多人使用Hibernate作为持久性提供程序,我想我可能会在这里添加这个。

z4bn682m

z4bn682m7#

对于数据库来说,不计算所有记录会更高效。
Spring-Data-JPA

@Query(value = ".....", nativeQuery = true)

或JPA:

@NamedNativeQuery(name=.., query="..", resultClass=..)

相关问题