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

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

是否有可能以某种方式编写将返回booleanexistBy<property> 方法。或者用 @Query(jpa query) 注释它,这样它就会返回 boolean

我知道我可以执行select count(*) 并返回long,但随后我将不得不执行!=0 检查我的服务层。

【问题讨论】:

  • "但是我必须做 !=0 检查我的服务层。"同样使用存在而不是计数对于数据库查询会更有效

标签: spring spring-data spring-data-jpa


【解决方案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);
    }
    

    【讨论】:

    【解决方案4】:

    如果您查看org.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID) 的来源,您会发现它使用TypedQuery 来计算记录并返回:

    query.getSingleResult() == 1
    

    您可以为您的 existsBy(...) 方法创建一个执行类似操作的查询。

    【讨论】:

    • 是的,我查看了源代码。到那时我将不得不实现我的 Dao 接口。当我不必这样做时,我正在寻找解决方案=)
    猜你喜欢
    • 2018-01-07
    • 2021-10-05
    • 2017-03-25
    • 2016-02-12
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多