hibernate - tutorial - spring jpa repository




Come utilizzare le query di criteri nell'applicazione Spring Data Jpa di avvio (4)

Ho un'applicazione che utilizza Spring Boot Data jpa. Finora sto usando un repository come questo

public interface StudentRepository extends CrudRepository<StudentEntity, Integer>{
          @Query(value = "SELECT s.studentname "
                    +"FROM StudentEntity s, CourseEntity c "
                    +"WHERE     s.courseid = c.courseid "
                    +"AND s.courseid IN (SELECT c.courseid "
                    +"FROM CourseEntity c "
                    +"WHERE c.coursename = ?1)")
      List<String> nameByCourse(String coursename);
}

Come posso utilizzare Criteria Query che Hibernate fornisce per questi casi in un'applicazione Spring Boot


Con Spring-boot-jpa puoi usare entityManager quasi ovunque. Il modo più comune è quello di creare una propria interface per i metodi personalizzati.

public interface StudentCustomRepository {

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

Quindi implementa questa interfaccia in una classe di servizio in cui puoi eseguire l'autowire e utilizzare l' 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);
     }
 }

Puoi anche decidere di implementare il tuo StudentRepository nella tua nuova classe StudentCustomRepositoryServiceImpl .


Dai docs

Per arricchire un repository con funzionalità personalizzate, devi prima definire un'interfaccia e un'implementazione per la funzionalità personalizzata. Utilizzare l'interfaccia del repository fornita per estendere l'interfaccia personalizzata.

Definisci un'interfaccia in questo modo

public interface StudentRepositoryCustom {

    List<String> nameByCourse(String coursename);

}

Quindi definire un'implementazione personalizzata di questa interfaccia in questo modo

@Service
class StudentRepositoryImpl implements StudentRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

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

}

Ora puoi estendere questa implementazione del repository personalizzato nel tuo repository JPA in questo modo.

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

}

Ulteriori informazioni sui criteri di ricerca e criteri di creazione here


puoi fare riferimento a Creazione di query nella documentazione JPA di dati primaverili e dare un'occhiata alla tabella, JPA offre più creazioni di Query dai nomi di metodi in cui è possibile evitare l'uso di una query String


JPA 2 introduce un'API criteri che può essere utilizzata per creare query a livello di codice.

È possibile estendere una nuova interfaccia da JpaSpecificationExecutor

public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {
    default List<Customer> findCustomers() {
    return findAll(CustomerSpecs.findCustomers());
}

Quindi creare le specifiche 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);
  }
};
}

Per maggiori dettagli, consulta questo documento di primavera qui

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







spring-data-jpa