当我扩展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(...)方法执行类似操作的查询。