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