Spring 数据 JPA 和 Exists 查询

Spring Data JPA and Exists query

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

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 查询必须是什么样子才能使这项工作正常进行?我知道我可以简单地 return 一个 Long 值,然后在 Java 代码中检查 count > 0,但这种解决方法应该不是必需的,对吗?

我认为您可以简单地将查询更改为 return boolean as

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

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

在我的例子中,它不像下面的那样工作

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

您可以return将其作为布尔值使用以下

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

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

<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);

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

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

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

参见文档 here

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

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

您可以使用 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(return 布尔值)。

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

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

您可以 return 像这样的布尔值:

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

这几天轻松多了!

@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

}

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