MyBatisJPA实现复杂条件分页查询

  相信熟悉Hibernate的人数对于ORM给编程带来的便利于快捷一定非生疏,相对于MyBatis等要编制复杂的SQL语句,ORM映射为咱带来的便宜显而易见。但是,在获得有利之以,失去的尽管是随波逐流,这里不是说Hibernate不灵活,只是对初学者来说,要掌握灵活的技能,需要的本相对比高。过去的一半年里,在路面临经过Spring
Cloud实现了扳平拟关于为劳动的基础架构,其中在数量持久层采用的是Spring Data
JPA,对于早已用过Hibernate的食指来说,选择JPA会格外便于上手,因为语法一切都是那么熟悉。但是,在关系到复杂的询问的时,尤其是大半规格查询的上,如果经过命名方式实现,长长的方法将是代码显得煞是的莫雅观。这个上,大多数丁会面选用NativeQuery,通过编制SQL语句来贯彻,这种措施导致的结果就是项目代码中遍地是SQL,随着年华的延,项目已错过了采用JPA的初衷。能否有同一种方法,在维系JPQL的风骨里做到这种复杂的查询也?这里介绍一种简易的主意:JpaSpecificationExecutor

  JpaSpecificationExecutor不属JpaRepository体系,它同意打定义查询条件实现查询。通过源码可以窥见,JpaSpecificationExecutor提供了如下几单主意:

  public interface
JpaSpecificationExecutor<T> {

  T findOne(Specification<T>
spec);

  List<T>
findAll(Specification<T> spec);

  Page<T>
findAll(Specification<T> spec, Pageable pageable);

  List<T>
findAll(Specification<T> spec, Sort sort);

  long count(Specification<T>
spec);

  }

  其中,Page<T>
findAll(Specification<T> spec, Pageable
pageable)是未是圈起特别熟稔,因为于JpaRepository我们为此的死去活来常见,只不过这里的入参不同,Pageable提供了排序分页的法力,Specification允许我们由定义查询条件,继续上源码:

public interface Specification<T>
{

  Predicate toPredicate(Root<T>
root, CriteriaQuery<?> query, CriteriaBuilder cb);

}

是的,这个接口提供了唯一方式toPredicate,通过该措施组织出一个犬牙交错查询条件。Root代表的凡实体,CriteriaBuilder是标准构造器,通过该办法,我们组织出复杂的查询条件并赶回,JPA就会活动的拍卖转换查询。下面为一个小demo描述下JpaSpecificationExecutor实现复杂查询的步调:

1、DAO层继承JpaSpecificationExecutor接口(当然,如果欲JpaRepository相关方法,同时继续即可)

@Component
public interface SpeciRepository extends
JpaSpecificationExecutor<TestVO>,JpaRepository<TestVO,
Long>{
}

2、Service构造查询条件,并调用DAO层

@Service

@Transactional

public class MySpeciServiceImpl implements
MySpeciService {

     @Autowired  private SpeciRepository
speciRepository;    

  @Override  public Page<TestVO>
findByPageAndParams(final TestVO param, int pageNumber,int pageSize) {
  

    Pageable pageable=new
PageRequest(pageNumber, pageSize);  //分页信息   

    Specification<TestVO> spec =
new Specification<TestVO>() {        //查询条件构造       

       @Override    public Predicate
toPredicate(Root<TestVO> root, CriteriaQuery<?>
query,CriteriaBuilder cb) {    

        Path<String> name =
root.get(“name”);      

        Path<Integer> age =
root.get(“age”);          

        Predicate p1 =
cb.like(name, “%”+param.getName()+”%”);     

        Predicate p2 = cb.lt(age,
param.getAge());     

           Predicate p = cb.and(p1,
p2);         

         return p;   

       }  

     };   

    return
speciRepository.findAll(spec, pageable);

   }

}

经上述两只步骤,就会落实一个主导的扑朔迷离分页查询,其实大粗略。其中的首要点就算是查询条件的构造,可以经过CriteriaBuilder提供的有关谓词进行组装。详细用法这里不累述,有趣味或来需要而自行baidu。

 

 

网站地图xml地图