Ответ 1
На самом деле вы можете использовать выражение case следующим образом:
select case when count(e) > 0 then true else false end from Entity e
where e.property = ?1 -- here go your conditions
Когда я расширяю интерфейс CrudRepository
, у меня есть метод exists(ID)
в моем субинтерфейсе. Я могу написать методы findBy<property>
.
Возможно ли каким-то образом написать метод existBy<property>
, который вернет boolean
. Или аннотировать его с помощью @Query(jpa query)
, чтобы он возвращал boolean
.
Я знаю, что могу сделать select count(*)
и вернуть long
, но тогда мне нужно будет сделать !=0
проверку моего уровня обслуживания.
На самом деле вы можете использовать выражение case следующим образом:
select case when count(e) > 0 then true else false end from Entity e
where e.property = ?1 -- here go your conditions
@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 данных JPA 1.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)
, вы увидите, что он использует TypedQuery
для подсчета записей и возврата:
query.getSingleResult() == 1
Вы можете создать запрос, который делает что-то похожее для ваших методов existsBy(...)
.