2012-08-29 13 views
23

Po rozszerzeniu interfejsu CrudRepository, mam metodę exists(ID) w moim poddziale. Potrafię pisać metody: findBy<property>.Dane sprężyny CrudRepository istnieje

Czy można w jakiś sposób napisać metodę existBy<property>, która zwróci boolean. Możesz też dodać adnotację z numerem @Query(jpa query), aby powrócił boolean.

Wiem, że mogę wykonać select count(*) i zwrócić long, ale wtedy będę musiał wykonać !=0 sprawdzić w mojej warstwie usługi.

+1

„ale wtedy będę musiał zrobić = 0 check w moim warstwie usług!”. Również użycie exist zamiast count byłoby nieco bardziej wydajne dla zapytania db – WeGa

Odpowiedz

2

Jeśli spojrzeć na źródło org.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID) wtedy widać, że używa TypedQuery liczyć zapisów i powroty:

query.getSingleResult() == 1 

Można utworzyć kwerendę, która robi coś podobnego do swoich metod existsBy(...).

+1

tak, zajrzałem do kodu źródłowego. Do tego czasu będę musiał zaimplementować mój interfejs Dao. Szukałem rozwiązania, gdy nie będę musiał tego robić =) –

19

Właściwie można użyć przypadku wyrażenia takiego:

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

Oleksandr @ odpowiedź jest poprawna, ale tylko w ten sposób mogę zmusić go do pracy jest następujący. Używam Eclipselink na 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); 
} 
+0

To dobre obejście dla Spring Data przed wersją 1.1.11. @ alexander-camperov, proszę przyjąć tę odpowiedź, jeśli zgadzasz się, że rozwiązuje ona twój problem. – naXa

9

od wiosny Danych WZP 1.11.0.RELEASE można teraz używać exists z wyprowadzeniu zapytań od nazwy metody. Na przykład, jeśli masz User podmiotowi własności email, można to zrobić:

public interface UserRepository extends JpaRepository<User, Long> { 

    boolean existsByEmail(String email); 
} 
+0

Wygląda na to, że 'existsBy' jest już uszkodzony: C https://jira.spring.io/browse/DATAJPA-851 –

Powiązane problemy