Spring Data JPA和Exists查询

时间:2015-05-22 08:42:11

标签: java hibernate jpa spring-data jpql

我正在使用Spring Data 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);

}

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

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

10 个答案:

答案 0 :(得分:116)

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

请参阅文档How to Debug your Apache JMeter Script

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

public interface MyEntityRepository extends CrudRepository<MyEntity, String> {  
    boolean existsByFoo(String foo);
}

答案 1 :(得分:51)

我认为您可以简单地将查询更改为返回布尔值

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

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

答案 2 :(得分:9)

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

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

答案 3 :(得分:8)

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

<S extends T> boolean exists(Example<S> example);

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

这几天变得越来越容易了!

@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

}

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

您可以只返回一个布尔值,如下所示:

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(existsIfBlaBla("0815"))可能是一个解决方案

答案 8 :(得分:0)

Spring data 提供了使用字段检查行是否存在的方法: 示例:boolean existsByEmployeeIdAndEmployeeName(String employeeId, String employeeName);

答案 9 :(得分:-2)

您可以在jpaRepository中使用.exists(返回布尔值)。

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

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