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