JPA的动态分页查询(封装多个查询条件)

背景

查询应该考虑程序的扩展性,使用mybatis可以实现查询条件的动态sql的拼接,springboot jpa如何实现这一功能呢?

eg:
动态查询出任务名称,任务状态,任务创建方式,查询方式的用户任务。
在这里插入图片描述
示例:

public PageBean findEmailGradeByUserId(Integer userId, Integer page, Date beginDate, Date endDate,
		Integer filterType,Integer dateType, String name, Integer status) {
		
	PageBean pageBean=new PageBean();
	// createTime表示按数据库中哪个字段排序,DESC倒序
	Pageable pageable = PageRequest.of(page - 1,pageBean.getPageSize(), Sort.by(Sort.Direction.DESC, "createTime"));
	Specification<EmailGradeTask> specification = new Specification<EmailGradeTask>() {
		private static final long serialVersionUID = 1L;

		@Override
		public Predicate toPredicate(Root<EmailGradeTask> root, CriteriaQuery<?> query,
				CriteriaBuilder criteriaBuilder) {
			List<Predicate> lst = new ArrayList<Predicate>();

			lst.add(criteriaBuilder.equal(root.get("userId"), userId));

			if (name != null) {
				lst.add(criteriaBuilder.like(root.get("name"), "%"+name+"%"));
			}
			if (status != null && status!=-2) {
				if (status == -3) {
					lst.add(criteriaBuilder.equal(root.get("billingStatus"), 0));
				} else {
					lst.add(criteriaBuilder.equal(root.get("status"), status));
				}
			}

			if(filterType!=null) {
				if (filterType==EmailGradeTask.FILTER_CREATE_TIME) {
					lst.add(criteriaBuilder.greaterThan(root.get("createTime"), beginDate));
					lst.add(criteriaBuilder.lessThan(root.get("createTime"), endDate));
				} else if (filterType == EmailGradeTask.FILTER_FINISHED_TIME) {
					lst.add(criteriaBuilder.greaterThan(root.get("finishTime"), beginDate));
					lst.add(criteriaBuilder.lessThan(root.get("finishTime"), endDate));
				}
			}
			return query.where(lst.toArray(new Predicate[] {})).getRestriction();

		}
	};
	System.out.println(specification.toString());

	// 封装分页查询条件
	Page<EmailGradeTask> emailGradeTaskList = emailGradeTaskRepository.findAll(specification, pageable);

	long count = emailGradeTaskRepository.count(specification);
	PageBean pageBean2 = new PageBean(pageBean.getPageSize(), count);
	pageBean2.setList(emailGradeTaskList.getContent());

	for(EmailGradeTask emailGradeTask:emailGradeTaskList.getContent()){
		System.out.println("查询结果是:"+emailGradeTask);
	}
	return pageBean2;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值