Вопрос по spring, spring-data-jpa, spring-data – Источник данных CrudRepository существует

27

Когда я расширяюCrudRepository интерфейс, у меня естьexists(ID) метод в моем подинтерфейсе. я могу написатьfindBy<property> методы.

Можно ли как-нибудь написатьexistBy<property> метод, который вернетboolean, Или комментировать это@Query(jpa query) так что вернетсяboolean.

Я знаю, что я могу сделатьselect count(*) и вернутьсяlong, но тогда мне придется сделать!=0 проверьте мой уровень обслуживания.

& quot; но тогда мне придется сделать проверку! = 0 в моем слое обслуживания. & quot; Кроме того, использование существует вместо счетчика будет немного более эффективным для запроса базы данных WeGa

Ваш Ответ

4   ответа
20

На самом деле вы можете использовать case 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(...) методы.

да, я посмотрел в исходном коде. К тому времени я должен буду реализовать свой интерфейс Dao. Я искал решение, когда мне не придется это делать =) Alexander Camperov
11

По данным Spring JPA1.11.0.RELEASEТеперь вы можете использоватьexists с выводом запроса из имен методов. Например, если у вас естьUser сущность сemail свойство, вы можете сделать это:

public interface UserRepository extends JpaRepository<User, Long> {

    boolean existsByEmail(String email);
}
Похоже на тоexistsBy сейчас сломан: Cjira.spring.io/browse/DATAJPA-851
21

Ответ @ Александра правильный, но я смог заставить его работать следующим образом. Я использую 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, пожалуйста, примите этот ответ, если вы согласны с тем, что он решает вашу проблему.

Похожие вопросы