Spring 数据 CrudRepository 存在

Posted

技术标签:

【中文标题】Spring 数据 CrudRepository 存在【英文标题】:Spring data CrudRepository exists 【发布时间】:2012-08-24 08:25:34 【问题描述】:

当我扩展CrudRepository 接口时,我的子接口中有exists(ID) 方法。我可以写findBy<property> 方法。

是否有可能以某种方式编写将返回booleanexistBy<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 CrudRepository 异常

Spring data : CrudRepository 的保存方法和更新

无法使用弹簧数据 jpa CrudRepository

Spring CrudRepository .orElseThrow()

Hibernate 和 CRUDRepository Spring Boot