Java教程:JPA如何使用Specification条件构造器查询复杂语句

Java教程:JPA如何使用Specification条件构造器查询复杂语句

自定义查询:

第一步:Dao层继承两个类

public interface ProcessBusinessNodeDao extends JpaRepository<ProcessBusinessNodePO, Integer>, JpaSpecificationExecutor<ProcessBusinessNodePO> {
}

第二步,直接上源码:

/**
  * 根据功能名称和业务id和发起类型不等于查询
  * @param functionNameDic 功能名称
  * @param entityId 业务id
  * @param launchType 发起类型
  * @return 数据集
  * @throws Exception 异常信息
  */
 @Override
 public List<ProcessBusinessNodePO> findByFunctionNameDicAndEntityIdAndlaunchTypeNot(Integer functionNameDic, Integer entityId, String launchType) throws Exception {
     if(functionNameDic == null || entityId == null){
         throw new Exception("必传参数不能为空");
     }
     Specification<ProcessBusinessNodePO> specification = (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.and(criteriaBuilder.equal(root.get("functionNameDic"), functionNameDic),
             criteriaBuilder.equal(root.get("entityId"), entityId), criteriaBuilder.equal(root.get("isValid"), CommonConstant.IS_VALID), criteriaBuilder.notEqual(root.get("launchType"), launchType));
     Sort sort = new Sort(Sort.Direction.DESC, "id");
     return processBusinessNodeDao.findAll(specification, sort);
 }

分页查询:

/**
  * 分页+条件获取按钮信息
  * @param current 当前页
  * @param rowCount 页行
  * @param searchParams 查询参数
  * @return
  */
 @Override
 public Page<BI> getAllButtonInfo(Integer current, Integer rowCount, Map<String, String> searchParams) {
     // 在 PageRequest 中首页是从0开始的
     long count = buttonDao.count();
     rowCount = PageUtils.initRowCount(rowCount);
     current = PageUtils.initPageCount(rowCount,current,count);
     Sort sort = new Sort(Sort.Direction.DESC, "createTime");
     Pageable pageable = new PageRequest(current - 1, rowCount, sort);
     Page<BI> pageBean = null;
     // 封装查询条件进行查询
     if (searchParams == null || searchParams.isEmpty()){
         pageBean = buttonDao.findAll(pageable);
     }else {
         Specification<BI> specification = new Specification<BI>() {
             public Predicate toPredicate(Root<BI> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                 List<Predicate> predicates = new LinkedList<Predicate>();
                 if (searchParams != null && searchParams.size() > 0) {
                     Set<String> keys = searchParams.keySet();
                     for (String key : keys) {
                         key = key.trim();
                         String value = searchParams.get(key).trim();
                         // 普通字段
                         if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value) && !"merchantNo".equals(key)) {
                             if (key.contains(".")) {
                                 String[] names = StringUtils.split(key, ".");
                                 Predicate predicate = criteriaBuilder.equal(root.join(names[0]).get(names[1]), value) ;
                                 predicates.add(predicate);
                             } else {
                                 Predicate predicate = criteriaBuilder.like(root.<String>get(key), value + "%");
                                 predicates.add(predicate);
                             }
                         }
                     }
                     if (searchParams.containsKey("merchantNo")) {
                         Predicate predicate = criteriaBuilder.equal(root.<String>get("merchantNo"), searchParams.get("merchantNo").trim());
                         predicates.add(predicate);
                     }
                 }
                 Predicate[] predicatesArray = new Predicate[predicates.size()];
                 return criteriaBuilder.and(predicates.toArray(predicatesArray));
             }
         };
         pageBean =  buttonDao.findAll(specification,pageable);
     }
     return pageBean;
 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值