Saltar al contenido

Cómo utilizar consultas de criterios en la aplicación Spring Boot Data Jpa

Solución:

Desde el docs

Para enriquecer un repositorio con funcionalidad personalizada, primero define una interfaz y una implementación para la funcionalidad personalizada. Utilice la interfaz de repositorio que proporcionó para ampliar la interfaz personalizada.

Definir una interfaz como esta

public interface StudentRepositoryCustom {

    List<String> nameByCourse(String coursename);

}

Luego defina una implementación personalizada de esta interfaz así

@Service
class StudentRepositoryImpl implements StudentRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    public List<String> nameByCourse(String coursename) {            
        CriteriaBuilder cb = em.getCriteriaBuilder();
        //Using criteria builder you can build your criteria queries.
    }

}

Ahora puede extender esta implementación de repositorio personalizado en su repositorio JPA de esta manera.

public interface StudentRepository extends CrudRepository<StudentEntity, Integer>, StudentRepositoryCustom {

}

Obtenga más información sobre la consulta de criterios y el generador de criterios here

Con Spring-boot-jpa tu eres capaz de usar entityManager casi en todas partes. La forma más común es crear un interface para métodos personalizados.

public interface StudentCustomRepository {

    void anyCustomMethod();
    Student getStudentByName(String name);
}

A continuación, implemente esta interfaz en una clase de servicio en la que pueda realizar el autowire y utilizar el entityManager:

@Service
public class StudentCustomRepositoryServiceImpl implements StudentCustomRepository {

     @PersistenceContext
     private EntityManager em;

     @Override
     public void anyCustomMethod(){
         //here use the entityManager
     }

     @Override
     StudentEntity getStudentByName(String name){
         Criteria crit = em.unwrap(Session.class).createCriteria(StudentEntity.class);
         crit.add(Restrictions.eq("name", name));
         List<StudentEntity> students = crit.list();
         return students.get(0);
     }
 }

También puede decidir implementar su StudentRepository a tu nuevo StudentCustomRepositoryServiceImpl clase.

JPA 2 presenta una API de criterios que se puede utilizar para crear consultas mediante programación.

Puede ampliar una nueva interfaz desde JpaSpecificationExecutor

public interface CustomerRepository extends 
  CrudRepository<Customer, Long>, 
  JpaSpecificationExecutor<Customer> {

  default List<Customer> findCustomers() {
    return findAll(CustomerSpecs.findCustomers());
  }

A continuación, cree las especificaciones del cliente.

public final class CustomerSpecs {

    public static Specification<Customer> findCustomers() {
        return new Specification<Customer>() {
            public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query,
            CriteriaBuilder builder) {

         LocalDate date = new LocalDate().minusYears(2);
         return builder.lessThan(root.get("birthday"), date);
      }
    };
}

Lo anterior se puede simplificar usando lambdas de la siguiente manera

public interface CustomerRepository extends 
  CrudRepository<Customer, Long>, 
  JpaSpecificationExecutor<Customer> {

  default List<Customer> findCustomers() {
    return findAll(
      (root, query, cb) -> {
         LocalDate date = new LocalDate().minusYears(2);
         return builder.lessThan(root.get("birthday"), date);
      }
    );
  }

Para obtener más detalles, consulte este documento de primavera aquí.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *