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

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

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

Specification<Model> sp = new Specification<Model>() {
	@Override
	public Predicate toPredicate(Root<Model> root, CriteriaQuery<?> query,CriteriaBuilder             
    cb) {
		
		List<Predicate> list = new ArrayList<Predicate>();
		Path<String> platform = root.get("platformName");
		Path<Integer> app = root.get("appId");
		Path<String> type = root.get("modelType");
		Path<String> 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<Object> in = cb.in(root.get("statusCode"));
in.value(Constant.MODEL_ADD);
in.value(Constant.MODEL_DISCONTINUATION);
list.add(in);
// 或者
In<Object> 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<Account> page = accountDao.findAll(sp,pageable);
// 总条数
long totalElements = page.getTotalElements();
// list集合
List<Account> content = page.getContent();

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值