2012-08-29 19 views
23

Quando estendo l'interfaccia CrudRepository, ho il metodo exists(ID) nel mio subinteface. Posso scrivere i metodi findBy<property>.Dati primari CrudRepository esiste

E 'possibile in qualche modo scrivere il metodo existBy<property> che restituirà boolean. O per annotarlo con @Query(jpa query) quindi restituirà boolean.

So che posso fare select count(*) e restituire long, ma poi dovrò fare !=0 controllare nel mio livello di servizio.

+1

"ma poi dovrò fare = 0 si verifica nel mio livello di servizio!". Anche l'utilizzo dell'esistenza al posto del conteggio sarebbe leggermente più efficiente per la query db – WeGa

risposta

2

Se si guarda alla fonte per org.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID) poi si vedrà che usa un TypedQuery per contare i record e ritorni:

query.getSingleResult() == 1 

è possibile creare una query che fa qualcosa di simile per i vostri existsBy(...) metodi.

+1

sì, ho cercato nel codice sorgente. A quel punto dovrò implementare la mia interfaccia Dao. Stavo cercando una soluzione quando non dovrei farlo =) –

19

In realtà è possibile utilizzare l'espressione caso come questo:

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

@ risposta di Oleksandr è corretta, ma l'unico modo ho potuto farlo funzionare è la seguente. Sto usando Eclipselink su 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

È una buona soluzione per Spring Data prima della versione 1.1.0. @ alexander-camperov per favore accetta questa risposta se sei d'accordo che risolve il tuo problema. – naXa

9

partire dalla primavera dati JPA 1.11.0.RELEASE, è ora possibile utilizzare exists con query di derivazione da nomi di metodo. Ad esempio, se si dispone di un'entità User con una proprietà email, si può fare questo:

public interface UserRepository extends JpaRepository<User, Long> { 

    boolean existsByEmail(String email); 
} 
+0

Sembra che 'existsBy' sia rotto ormai: C https://jira.spring.io/browse/DATAJPA-851 –

Problemi correlati