Java Spring数据JPA和Exists查询

Java Spring数据JPA和Exists查询,java,hibernate,jpa,spring-data,jpql,Java,Hibernate,Jpa,Spring Data,Jpql,我正在使用Spring数据JPA(Hibernate作为我的JPA提供程序),并希望定义一个带有HQL查询的exists方法: public interface MyEntityRepository extends CrudRepository<MyEntity, String> { @Query("select count(e) from MyEntity e where ...") public boolean existsIfBlaBla(@Param("id") S

我正在使用Spring数据JPA(Hibernate作为我的JPA提供程序),并希望定义一个带有HQL查询的
exists
方法:

public interface MyEntityRepository extends CrudRepository<MyEntity, String> {

  @Query("select count(e) from MyEntity e where ...")
  public boolean existsIfBlaBla(@Param("id") String id);

}
公共接口MyEntityRepository扩展了CrudRepository{
@查询(“从MyEntity e中选择计数(e),其中…”)
公共布尔existsIfBlaBla(@Param(“id”)字符串id);
}
当我运行这个查询时,我得到一个
java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Boolean


HQL查询必须是什么样子才能工作?我知道我可以简单地返回一个长值,然后在
count>0
时检入我的Java代码,但这种解决方法应该不是必需的,对吗

我认为您只需将查询更改为返回布尔值即可

@Query("select count(e)>0 from MyEntity e where ...")
附言:
如果您是基于主键值检查exists
crudepository
已经有了
exists(id)
方法。

我想您只需将查询更改为返回布尔值即可

@Query("select count(e)>0 from MyEntity e where ...")
附言:
如果您是基于主键值检查exists
crudepository
已经有了
exists(id)
方法。

在我的例子中,它的工作方式与下面的不同

@Query("select count(e)>0 from MyEntity e where ...")
您可以使用以下命令将其作为布尔值返回

@Query(value = "SELECT CASE  WHEN count(pl)> 0 THEN true ELSE false END FROM PostboxLabel pl ...")

在我的情况下,它不像下面那样工作

@Query("select count(e)>0 from MyEntity e where ...")
您可以使用以下命令将其作为布尔值返回

@Query(value = "SELECT CASE  WHEN count(pl)> 0 THEN true ELSE false END FROM PostboxLabel pl ...")

自Spring data 1.12以来,您可以通过扩展
QueryByExampleExecutor
接口来使用“按示例查询”功能性(《代码》)JpaRepository已经对其进行了扩展。
然后,您可以使用此查询(以及其他查询):


自Spring data 1.12以来,您可以通过扩展
QueryByExampleExecutor
接口来使用“按示例查询”功能性(《代码》)JpaRepository已经对其进行了扩展。
然后,您可以使用此查询(以及其他查询):


除了公认的答案外,我建议另一种选择。 使用、创建谓词并使用接受谓词并返回布尔值的
exists()
方法


QueryDSL的一个优点是可以对复杂的where子句使用谓词。

除了公认的答案之外,我建议另一种选择。 使用、创建谓词并使用接受谓词并返回布尔值的
exists()
方法

QueryDSL的一个优点是可以对复杂的where子句使用谓词。

Spring数据JPA 1.11现在支持存储库查询派生中的
exists
投影

见文件

在您的情况下,以下操作将起作用:

public interface MyEntityRepository extends CrudRepository<MyEntity, String> {  
    boolean existsByFoo(String foo);
}
公共接口MyEntityRepository扩展了Crudepository{
布尔existsByFoo(字符串foo);
}
Spring数据JPA 1.11现在支持存储库查询派生中的
exists
投影

见文件

在您的情况下,以下操作将起作用:

public interface MyEntityRepository extends CrudRepository<MyEntity, String> {  
    boolean existsByFoo(String foo);
}
公共接口MyEntityRepository扩展了Crudepository{
布尔existsByFoo(字符串foo);
}

您可以使用
大小写
表达式在select查询中返回
布尔值
,如下所示

@Query("SELECT CASE WHEN count(e) > 0 THEN true ELSE false END FROM MyEntity e where e.my_column = ?1")

您可以使用
Case
表达式在select查询中返回
boolean
,如下所示

@Query("SELECT CASE WHEN count(e) > 0 THEN true ELSE false END FROM MyEntity e where e.my_column = ?1")
您可以在jpaRepository中使用.exists(返回布尔值)

if(commercialRuleMsisdnRepo.exists(commercialRuleMsisdn.getRuleId())!=true){

        jsRespon.setStatusDescription("SUCCESS ADD TO DB");
    }else{
        jsRespon.setStatusCode("ID already exists is database");
    }
您可以在jpaRepository中使用.exists(返回布尔值)

if(commercialRuleMsisdnRepo.exists(commercialRuleMsisdn.getRuleId())!=true){

        jsRespon.setStatusDescription("SUCCESS ADD TO DB");
    }else{
        jsRespon.setStatusCode("ID already exists is database");
    }

您只需返回如下布尔值:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.data.repository.query.Param;

@QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "1"))
@Query(value = "SELECT (1=1) FROM MyEntity WHERE ...... :id ....")
Boolean existsIfBlaBla(@Param("id") String id);

Boolean.TRUE.equals(existsifblablabla(“0815”))
可能是一个解决方案

您可以像这样返回一个布尔值:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.data.repository.query.Param;

@QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "1"))
@Query(value = "SELECT (1=1) FROM MyEntity WHERE ...... :id ....")
Boolean existsIfBlaBla(@Param("id") String id);

Boolean.TRUE.equals(existsifblablabla(“0815”))
可能是一个解决方案

这几天变得容易多了

@Repository
public interface PageRepository extends JpaRepository<Page, UUID> {

    Boolean existsByName(String name); //Checks if there are any records by name
    Boolean existsBy(); // Checks if there are any records whatsoever

}
@存储库
公共接口页面存储库扩展了JpaRepository{
Boolean existsByName(字符串名);//按名称检查是否有记录
Boolean existsBy();//检查是否有任何记录
}

这几天变得容易多了

@Repository
public interface PageRepository extends JpaRepository<Page, UUID> {

    Boolean existsByName(String name); //Checks if there are any records by name
    Boolean existsBy(); // Checks if there are any records whatsoever

}
@存储库
公共接口页面存储库扩展了JpaRepository{
Boolean existsByName(字符串名);//按名称检查是否有记录
Boolean existsBy();//检查是否有任何记录
}

显然,您可以更改JPQL查询以返回布尔值。。。通过不返回“count(e)”,而是返回一个布尔表达式,您可以将JPQL查询更改为返回一个布尔表达式。。。通过不返回“count(e)”,而是返回布尔表达式感谢指向
exists(id)
,但是我的where子句包含一些复杂的约束…
count(e)>e
可能只适用于某些数据库(例如Oracle)。对于DB2,它不是这样,您必须使用
选择case when count(e)>0,然后使用true或false结束实体e
在此处执行SQL exists查询,而不是计数行。使用count必须完成一个索引中的所有行(希望如此),否则就不需要索引就可以进行表扫描。SQL exists将在遇到的第一行之后返回,而不是查找每一行并按count(*)的方式进行计数。在一个10行的表格中,这在10秒/100秒(千分之十)内是没有问题的,而且在这之后,这很重要;在没有更好的解决方案的情况下,答案是可行的,但不是最优的。感谢指向
存在(id)
,但我的where子句包含一些复杂的约束…
count(e)>e
可能只适用于某些数据库(例如Oracle)。对于DB2,它不是这样,您必须使用
选择case when count(e)>0,然后使用true或false结束实体e
在此处执行SQL exists查询,而不是计数行。使用count必须完成一个索引中的所有行(希望如此),否则就不需要索引就可以进行表扫描。SQL exists将在遇到的第一行之后返回,而不是查找每一行并按count(*)的方式进行计数。在一个10行的表格中,这在10秒/100秒(千分之一)内是没有问题的,这很重要