java - mkyong - Spring Data JPA y existe consulta
spring data jpa join query example (7)
Estoy usando Spring Data JPA (con Hibernate como mi proveedor de JPA) y quiero definir un método exists
con una consulta HQL adjunta:
public interface MyEntityRepository extends CrudRepository<MyEntity, String> {
@Query("select count(e) from MyEntity e where ...")
public boolean existsIfBlaBla(@Param("id") String id);
}
Cuando ejecuto esta consulta, obtengo una java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Boolean
.
¿Cómo debe verse la consulta HQL para que esto funcione? Sé que simplemente podría devolver un valor Largo y luego verificar mi código Java si count > 0
, pero esa solución no debería ser necesaria, ¿verdad?
Aparte de la respuesta aceptada, sugiero otra alternativa. Use QueryDSL , cree un predicado y use el método de exists()
que acepta un predicado y devuelve Booleano.
Una ventaja de QueryDSL es que puede usar el predicado para las cláusulas where complicadas.
Creo que simplemente puede cambiar la consulta para devolver boolean como
@Query("select count(e)>0 from MyEntity e where ...")
PD: Si está comprobando que existe en función del valor de clave principal, el CrudRepository
ya exists(id)
.
Desde los datos 1.12 de Spring, puede usar la consulta mediante la funcionalidad de ejemplo extendiendo la interfaz QueryByExampleExecutor
(el JpaRepository
ya lo extiende).
Luego puedes usar esta consulta (entre otras):
<S extends T> boolean exists(Example<S> example);
Considere una entidad MyEntity
que, como name
propiedad, desea saber si existe una entidad con ese nombre, ignorando el caso, entonces la llamada a este método puede tener este aspecto:
//The ExampleMatcher is immutable and can be static I think
ExampleMatcher NAME_MATCHER = ExampleMatcher.matching()
.withMatcher("name", GenericPropertyMatchers.ignoreCase());
Example<MyEntity> example = Example.<MyEntity>of(new MyEntity("example name"), NAME_MATCHER);
boolean exists = myEntityRepository.exists(example);
Puede usar .exists (return boolean) en jpaRepository.
if(commercialRuleMsisdnRepo.exists(commercialRuleMsisdn.getRuleId())!=true){
jsRespon.setStatusDescription("SUCCESS ADD TO DB");
}else{
jsRespon.setStatusCode("ID already exists is database");
}
Puede usar Expresión de Case
para devolver un boolean
en su consulta de selección como se muestra a continuación.
@Query("SELECT CASE WHEN count(e) > 0 THEN true ELSE false END FROM MyEntity e where e.my_column = ?1")
en mi caso no funcionó como seguir
@Query("select count(e)>0 from MyEntity e where ...")
Puedes devolverlo como valor booleano con el siguiente
@Query(value = "SELECT CASE WHEN count(pl)> 0 THEN true ELSE false END FROM PostboxLabel pl ...")
Spring Data JPA 1.11 ahora admite la proyección exists
en la derivación de consulta de repositorio.
Vea la documentación here .
En tu caso funcionará lo siguiente:
public interface MyEntityRepository extends CrudRepository<MyEntity, String> {
boolean existsByFoo(String foo);
}