我正在使用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
,但是这种解决方法不是必需的,对吧?
答案 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");
}