Spring 数据 CrudRepository 存在
Posted
技术标签:
【中文标题】Spring 数据 CrudRepository 存在【英文标题】:Spring data CrudRepository exists 【发布时间】:2012-08-24 08:25:34 【问题描述】:当我扩展CrudRepository
接口时,我的子接口中有exists(ID)
方法。我可以写findBy<property>
方法。
是否有可能以某种方式编写将返回boolean
的existBy<property>
方法。或者用 @Query(jpa query)
注释它,这样它就会返回 boolean
。
我知道我可以执行select count(*)
并返回long
,但随后我将不得不执行!=0
检查我的服务层。
【问题讨论】:
"但是我必须做 !=0 检查我的服务层。"同样使用存在而不是计数对于数据库查询会更有效 【参考方案1】:@Oleksandr 的回答是正确的,但我可以让它工作的唯一方法如下。我在 PostgreSQL 上使用 Eclipselink。
public interface UserRepository extends JpaRepository<User, Long>
@Query("SELECT CASE WHEN COUNT(u) > 0 THEN 'true' ELSE 'false' END FROM User u WHERE u.username = ?1")
public Boolean existsByUsername(String username);
【讨论】:
对于 v1.11.0 之前的 Spring Data 来说是一个很好的解决方法。 @alexander-camperov 如果您同意它可以解决您的问题,请接受此答案。【参考方案2】:其实你可以这样使用case表达式:
select case when count(e) > 0 then true else false end from Entity e
where e.property = ?1 -- here go your conditions
【讨论】:
【参考方案3】:从 Spring Data JPA 1.11.0.RELEASE
开始,您现在可以将 exists
与方法名称的查询派生一起使用。例如,如果您有一个具有email
属性的User
实体,您可以这样做:
public interface UserRepository extends JpaRepository<User, Long>
boolean existsByEmail(String email);
【讨论】:
看来existsBy
现在已经坏了:C jira.spring.io/browse/DATAJPA-851
它有效,正是我想要的。感谢分享。【参考方案4】:
如果您查看org.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID)
的来源,您会发现它使用TypedQuery
来计算记录并返回:
query.getSingleResult() == 1
您可以为您的 existsBy(...)
方法创建一个执行类似操作的查询。
【讨论】:
是的,我查看了源代码。到那时我将不得不实现我的 Dao 接口。当我不必这样做时,我正在寻找解决方案=)以上是关于Spring 数据 CrudRepository 存在的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Boot CrudRepository 过滤数据
Spring data : CrudRepository 的保存方法和更新