一個jpa動態模糊查詢的實現


最近一直在是用spring data jpa,使用起來確實方便,如果是單表的操作基本上通過方法名都可以實現,下面是一個

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
 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM