Spring Data JPA和Exists查询

我正在使用Spring Data JPA(Hibernate作为我的JPA提供程序)并且希望定义一个附加了HQL查询的exists方法:

 public interface MyEntityRepository extends CrudRepository { @Query("select count(e) from MyEntity e where ...") public boolean existsIfBlaBla(@Param("id") String id); } 

当我运行此查询时,我得到一个java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Boolean

HQL查询如何使其工作? 我知道我可以简单地返回一个Long值,然后检查我的Java代码,如果count > 0 ,但该解决方法不是必需的,对吧?

我想你可以简单地改变查询以返回boolean as

 @Query("select count(e)>0 from MyEntity e where ...") 

PS:如果你检查是否存在基于主键值的CrudRepository已经exists(id)方法。

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

请参阅此处的文档

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

 public interface MyEntityRepository extends CrudRepository { boolean existsByFoo(String foo); } 

从Spring数据1.12开始,您可以通过扩展QueryByExampleExecutor接口( JpaRepository已经扩展它)来使用示例functionnality的查询。
然后你可以使用这个查询(以及其他):

  boolean exists(Example example); 

考虑一个实体MyEntity作为属性name ,您想知道具有该名称的实体是否存在,忽略大小写,那么对此方法的调用可能如下所示:

 //The ExampleMatcher is immutable and can be static I think ExampleMatcher NAME_MATCHER = ExampleMatcher.matching() .withMatcher("name", GenericPropertyMatchers.ignoreCase()); Example example = Example.of(new MyEntity("example name"), NAME_MATCHER); boolean exists = myEntityRepository.exists(example); 

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

 @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 ...") 

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

QueryDSL的一个优点是您可以将谓词用于复杂的where子句。

您可以使用Case表达式在您的选择查询中返回一个boolean ,如下所示。

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

您可以在jpaRepository中使用.exists(return boolean)。

 if(commercialRuleMsisdnRepo.exists(commercialRuleMsisdn.getRuleId())!=true){ jsRespon.setStatusDescription("SUCCESS ADD TO DB"); }else{ jsRespon.setStatusCode("ID already exists is database"); }