spring jpa之复杂查询(分页,条件,模糊等)

在项目中使用到了jpa,从生疏到慢慢摸索熟悉,现将比较复杂的运用记录下来。

在使用jpa中,总会遇到比较复杂的查询。比如:分页,有分页一般就会少不了条件拼接查询,然后在加上一些排序、下拉选、模糊查询等等。这种情况我们就需要用到jpa中的Specification和它的@Overridepublic Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {}方法了。这个可以自定义一些你需要的查询条件和查询方法以及排序分页等都能实现。

Specification sp = new Specification() {
	@Override
	public Predicate toPredicate(Root root, CriteriaQuery query,CriteriaBuilder             
    cb) {
		
		List list = new ArrayList();
		Path platform = root.get("platformName");
		Path app = root.get("appId");
		Path type = root.get("modelType");
		Path name = root.get("modelName");
		if(StringUtils.isNotBlank(platformName)) {
			list.add(cb.equal(platform, platformName));
		}
		if(StringUtils.isNotBlank(modelType)) {
			list.add(cb.equal(type, modelType));
		}
		if(StringUtils.isNotBlank(String.valueOf(appId))) {
			list.add(cb.equal(app, appId));
		}
		
		query.where(list.toArray(new Predicate[list.size()]));
    }
		
};

还有其中in的用法

In in = cb.in(root.get("statusCode"));
in.value(Constant.MODEL_ADD);
in.value(Constant.MODEL_DISCONTINUATION);
list.add(in);
// 或者
In in = cb.in(root.get("id"));
for (String string : modelIds) {
	in.value(string);
}
list.add(in); 
  

模糊查询like的用法

list.add(cb.like(name, "%"+modelName+"%"));

排序

query.orderBy(cb.desc(root.get("modelName")));

分页

//分页信息(从0开始)
Pageable pageable = new PageRequest(pageNum-1,pageSize);
// 分页查询(sp就是Specification)
Page page = accountDao.findAll(sp,pageable);
// 总条数
long totalElements = page.getTotalElements();
// list集合
List content = page.getContent();

 

你可能感兴趣的:(spring,boot)