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;
}