2012-08-29 12 views
23

Cuando extiendo CrudRepository interfaz, tengo el método exists(ID) en mi subinteface. Puedo escribir findBy<property> métodos.Datos de primavera CrudRepository existe

¿Es posible de alguna manera escribir el método existBy<property> que devolverá boolean. O para anotarlo con @Query(jpa query) por lo que devolverá boolean.

Sé que puedo hacer select count(*) y devolver long, pero luego tendré que hacer !=0 comprobar en mi capa de servicio.

+1

"pero entonces tendrá que hacer = 0 cheque en mi capa de servicio!". También usar existir en lugar de contar sería un poco más eficiente para la consulta db – WeGa

Respuesta

2

Si nos fijamos en la fuente de org.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID) entonces verá que utiliza un TypedQuery para contar registros y devoluciones:

query.getSingleResult() == 1 

Se puede crear una consulta que hace algo similar para sus existsBy(...) métodos.

+1

, sí, busqué en el código fuente. Para entonces tendré que implementar mi interfaz Dao. Estaba buscando una solución cuando no tengo que hacer eso =) –

19

En realidad se puede utilizar la expresión caso como este:

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

@ respuesta de Oleksandr es correcta, pero la única manera de que pudiera conseguir que funcione es la siguiente. Estoy usando Eclipselink en 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

Es una buena solución para Spring Data antes de v1.11.0. @ alexander-camperov acepte esta respuesta si está de acuerdo con que resuelva su problema. – naXa

9

A partir de la primavera de datos JPA 1.11.0.RELEASE, ahora se puede utilizar exists con derivación consulta de nombres de método. Por ejemplo, si tiene una entidad User con una propiedad email, usted puede hacer esto:

public interface UserRepository extends JpaRepository<User, Long> { 

    boolean existsByEmail(String email); 
} 
+0

Parece que 'existsBy' está roto por ahora: C https://jira.spring.io/browse/DATAJPA-851 –

Cuestiones relacionadas