如何在Spring Boot Data Jpa应用程序中使用Criteria Queries

Rah*_*hul 11 hibernate spring-data-jpa spring-boot

我有一个使用Spring Boot Data jpa的应用程序.到目前为止,我正在使用这样的存储库

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);
}
Run Code Online (Sandbox Code Playgroud)

我如何利用Hibernate在Spring Boot Application中为这种情况提供的Criteria Query

Abd*_*han 21

来自 docs

要使用自定义功能丰富存储库,首先要为自定义功能定义接口和实现.使用您提供的存储库接口来扩展自定义接口.

定义一个这样的界面

public interface StudentRepositoryCustom {

    List<String> nameByCourse(String coursename);

}
Run Code Online (Sandbox Code Playgroud)

然后像这样定义此接口的自定义实现

@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.
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,您可以像这样在JPA存储库中扩展此自定义存储库实现.

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

}
Run Code Online (Sandbox Code Playgroud)

详细了解条件查询和条件构建器 here


Pat*_*ick 5

有了Spring-boot-jpa您,您entityManager几乎可以在任何地方使用。最常见的方法是interface为自定义方法创建自己的方法。

public interface StudentCustomRepository {

    void anyCustomMethod();
    Student getStudentByName(String name);
}
Run Code Online (Sandbox Code Playgroud)

然后将该接口实现到服务类,您可以在其中自动装配并使用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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

您还可以决定StudentRepository将您的StudentCustomRepositoryServiceImpl课程实施到您的新班级。


sen*_*982 5

JPA 2引入了一个标准API,可用于以编程方式构建查询。

您可以从扩展新界面 JpaSpecificationExecutor

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

然后创建客户规格

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);
  }
};
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请在此处参考此春季文档

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