当我扩展CrudRepository
接口时,我的子接口中有exists(ID)
方法。我可以写findBy<property>
方法。
是否有可能以某种方式编写existBy<property>
将返回的方法boolean
。或对其进行注释,@Query(jpa query)
使其返回boolean
。
我知道我可以做select count(*)
并返回long
,但是我必须!=0
检查我的服务层。
当我扩展CrudRepository
接口时,我的子接口中有exists(ID)
方法。我可以写findBy<property>
方法。
是否有可能以某种方式编写existBy<property>
将返回的方法boolean
。或对其进行注释,@Query(jpa query)
使其返回boolean
。
我知道我可以做select count(*)
并返回long
,但是我必须!=0
检查我的服务层。
@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);
}
实际上,您可以像这样使用 case 表达式:
select case when count(e) > 0 then true else false end from Entity e
where e.property = ?1 -- here go your conditions
从 Spring Data JPA1.11.0.RELEASE
开始,您现在可以使用exists
方法名称的查询派生。例如,如果您有一个User
具有属性的实体email
,您可以这样做:
public interface UserRepository extends JpaRepository<User, Long> {
boolean existsByEmail(String email);
}
如果您查看源代码,org.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID)
您将看到它使用 aTypedQuery
来计算记录并返回:
query.getSingleResult() == 1
您可以创建一个对您的existsBy(...)
方法执行类似操作的查询。