一个jpa动态模糊查询的实现

最近一直在是用spring data jpa,使用起来确实方便,若是是单表的操做基本上经过方法名均可以实现,下面是一个spring

Specification 实现动态模糊查询的例子

这个查询是经过JpaSpecificationExecutor 这个接口实现的,只须要实现接口的toPredicate()方法jike,在Dao层不须要太多操做,只需生命接口,继承接口,声明方法便可
我这个实现是和分页排序接口在一块的,因此我是继承了两个接口,分页排序接口PagingAndSortingRepository,查询接口JpaSpecificationExecutor,这两个接口都是来自jpa的接口,在具体使用时
有这么一种状况,我不知道是否是广泛的或只是个人个例,就是若是只继承查询接口JpaSpecificationExecutor,会致使不能注入。下面贴代码:
1,dao层
public interface ParkInfoRepository extends PagingAndSortingRepository<ParkInfoPo, String> ,JpaSpecificationExecutor<ParkInfoPo> {
//查询全部
List<ParkInfoPo> findAll();
//模糊匹配搜索
List<ParkInfoPo> findAll(Specification<ParkInfoPo> specification);
}
dao层仅是声明接口,方法,继承,完成这些事情就能够了
2 service层实现
@Override
public ParkInfoPoList getParkInfoList(ParkInfoPo parkInfoPo) {
if(parkInfoPo!=null&&!StringUtils.isEmpty(parkInfoPo.getParkFullName())){
final String keyWords = parkInfoPo.getParkFullName();
List<ParkInfoPo> list = parkInfoRepository.findAll(new Specification<ParkInfoPo>() {
@Override
public Predicate toPredicate(Root<ParkInfoPo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
Predicate parkFullNamePredicate = cb.like(root.get("parkFullName").as(String.class), "%"+keyWords+"%");
criteriaQuery.where(cb.and(parkFullNamePredicate));
criteriaQuery.orderBy(cb.asc(root.get("updateTime").as(Date.class)));
return criteriaQuery.getRestriction();
}
});
return ParkInfoPoList.wrap(list);
}
List<ParkInfoPo> parkInfoPoList = parkInfoRepository.findAll();
return ParkInfoPoList.wrap(parkInfoPoList);
}
要把方法中的参数出入方法中的内部类,要用final类型,我这是只实现了一个查询条件即“parkFullName”,若是要用多个字段查询的话,可用拼接,如: query.where(cb.and(p3,cb.or(p1,p2)));
,还能够用list,如
  1. Specification<UserModel> spec = new Specification<UserModel>() {  
  2. public Predicate toPredicate(Root<UserModel> root,  
  3.         CriteriaQuery<?> query, CriteriaBuilder cb) {  
  4.     List<Predicate> list = new ArrayList<Predicate>();  
  5.           
  6.     if(um.getName()!=null && um.getName().trim().length()>0){  
  7.         list.add(cb.like(root.get("name").as(String.class), "%"+um.getName()+"%"));  
  8.     }  
  9.     if(um.getUuid()>0){  
  10.         list.add(cb.equal(root.get("uuid").as(Integer.class), um.getUuid()));  
  11.     }  
  12.     Predicate[] p = new Predicate[list.size()];  
  13.     return cb.and(list.toArray(p));  
  14. }  
  15. };  这段代码也是我从网上贴过来的,但愿不要形成干扰
具体你们能够百度。我这只用了一个查询字段,还没扩充,这就是我得所有实现,其实也很简单。有什么不明白能够联系我,qq253364185,phone13524929851
相关文章
相关标签/搜索