Spring data CrudRepository exists

31
当我扩展`CrudRepository`接口时,在我的子接口中有一个`exists(ID)`方法。我可以编写`findBy<property>`方法。是否有可能以某种方式编写返回`boolean`的`existBy<property>`方法或用`@Query(jpa query)`进行注释以返回`boolean`。
我知道我可以执行`select count(*)`并返回`long`,但是然后我将不得不在我的服务层中执行`!=0`检查。

1
"但是这样我就必须在我的服务层中进行!=0的检查。另外,对于数据库查询,使用exist而不是count会稍微更有效率一些。" - WeGa
4个回答

25

@Oleksandr的回答是正确的,但我能让它工作的唯一方法如下。我正在使用Eclipselink在PostgreSQL上。

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);
}

这是Spring Data v1.11.0之前的一个不错的解决方法。@alexander-camperov如果您认为它解决了您的问题,请接受此答案。 - naXa stands with Ukraine

23

从Spring Data JPA 1.11.0.RELEASE开始,您现在可以使用方法名称派生查询结合exists。例如,如果您有一个带有email属性的User实体,您可以这样做:

public interface UserRepository extends JpaRepository<User, Long> {

    boolean existsByEmail(String email);
}

1
现在看来 existsBy 已经坏了 :C https://jira.spring.io/browse/DATAJPA-851 - Alfonso Nishikawa
它运行良好,正是我想要的。感谢分享。 - Ajay Kumar

21

实际上你可以像这样使用case表达式:

select case when count(e) > 0 then true else false end from Entity e
where e.property = ?1 -- here go your conditions

2

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

query.getSingleResult() == 1

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


1
是的,我查看了源代码。到那时我将不得不实现我的Dao接口。我正在寻找一种无需这样做的解决方案=) - Alexander Camperov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接