hibernate - tutorial - spring jpa repository




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

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 .

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


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