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
有了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课程实施到您的新班级。
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
| 归档时间: |
|
| 查看次数: |
30283 次 |
| 最近记录: |