zoukankan      html  css  js  c++  java
  • 一个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
     




  • 相关阅读:
    数据结构的理解
    等价、偏序和全序
    等价、偏序和全序
    二叉树与树的理解
    SICP 习题 (2.10)解题总结: 区间除法中除于零的问题
    div:给div加滚动栏 div的滚动栏设置
    textarea文本域宽度和高度(width、height)自己主动适应变化处理
    OSX: 逻辑卷管理系统Core Storage(1)
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    string实现
  • 原文地址:https://www.cnblogs.com/zhaoblog/p/6136559.html
Copyright © 2011-2022 走看看