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"); }
- Java代码审查:将已排序的列表合并为单个排序列表
- 无法自动assembly字段:private org.springframework.security.core.userdetails.UserDetailsService
- 解释使用Hibernate映射自动递增的复合id序列的行为
- JavaFX + Hibernate(JPA)持久性+ Derby DB
- 如何使用hibernate持久化HashMap
- 如何正确处理两个线程更新数据库中的同一行
- 无法获得org.hibernate.persister.entity.SingleTableEntityPersister的构造函数
- java.lang.NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index;
- Hibernate本机查询:无效的列名错误SQL-17006
- org.codehaus.jackson.map.JsonMappingException:无限递归(StackOverflowError)
- 创建名为’org.springframework.security.filterChains’Spring + Hibernate + UserDetailService的bean时出错