jpa hibernate分页查询

本文介绍如何利用JPA与Hibernate框架进行分页查询,通过Pageable接口和PageUtils工具类实现高效的数据分页展示,帮助开发者优化数据库操作并提升应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工具类pageutils

/**
	 * 当前页
	 */
	private int currentPage;
	/**
	 * 每页数据条数
	 */
	private int pageSize;

	/**
	 * 经销商
	 */
	private Dealer dealer;

	/**
	 * 贷款
	 */
	private Loan loan;

	/**
	 * 起始时间
	 */
	private Date startTime;

	/**
	 * 终止时间
	 */
	private Date endTime;

	/**
	 * 金额最小值
	 */
	private BigDecimal minMoney;

	/**
	 * 金额最大值
	 */
	private BigDecimal maxMoney;

	/**
	 * 城市
	 */
	private Cities cities;
	/**
	 * 经纪人
	 */
	private Agent agent;
	/**
	 * 酒厂
	 */
	private Distillery distillery;

	/**
	 * 提货
	 */
	private Pickup pickup;

	/**
	 * 还款计划
	 */
	private RepaymentPlan repaymentPlan;

	/**
	 * 管理员
	 */
	private Manager manager;


Dao层

/**
	 * 多条件分页查询贷款信息
	 * 
	 * @param spec
	 * @param pageable
	 * @return
	 */
	Page<Loan> findAll(Specification<Loan> spec, Pageable pageable);



Service层

/**
	 * 申请贷款时分页查询用到的方法
	 */
	@Override
	public Page<Loan> findAllByMultiConditionAndPage(PageUtils pageUtils) {
		// 获取当前登录用户所对应的经销商
		UserDetails userDetails = (UserDetails) SecurityContextHolder
				.getContext().getAuthentication().getPrincipal();
		String username = userDetails.getUsername();
		User user = userService.findByName(username);

		// 拼接多条件分页查询
		Sort sort = new Sort(Direction.DESC, "loanApplicationDate");
		PageRequest pageRequest = new PageRequest(
				pageUtils.getCurrentPage() - 1, pageUtils.getPageSize(), sort);
		return loanDao.findAll(new Specification<Loan>() {

			@Override
			public Predicate toPredicate(Root<Loan> root,
					CriteriaQuery<?> query, CriteriaBuilder builder) {

				Loan loan = null;
				if (null == pageUtils.getLoan()) {
					loan = new Loan();
					loan.setDealer(user.getDealer());
				} else {
					loan = pageUtils.getLoan();
					loan.setDealer(user.getDealer());
				}

				List<Predicate> predicates = new ArrayList<Predicate>();
				// 先加入对应的经销商ID,只能查询属于他自己的贷款记录
				predicates.add(builder.equal(
						root.get("dealer").get("dealerId"), loan.getDealer()
								.getDealerId()));
				// 加入酒厂
				if (null != loan.getDistillery()
						&& StringUtils.isNotBlank(loan.getDistillery()
								.getDistilleryName())) {
					predicates.add(builder.equal(root.get("distillery"),
							loan.getDistillery()));
				}
				// 加入贷款申请状态
				if (null != loan.getLoanState()
						&& !LoanState.被删除.equals(loan.getLoanState())) {
					predicates.add(builder.equal(root.get("loanState"),
							loan.getLoanState()));
				}
				// 加入申请贷款时间
				if (null != pageUtils.getStartTime()
						&& null != pageUtils.getEndTime()) {
					predicates.add(builder.between(
							root.get("loanApplicationDate"),
							pageUtils.getStartTime(), pageUtils.getEndTime()));
				}
				// 加入申请贷款周期
				if (null != loan.getLoanCycle()) {
					predicates.add(builder.equal(root.get("loanCycle"),
							loan.getLoanCycle()));
				}
				// 加入申请贷款金额
				if (null != pageUtils.getMinMoney()
						&& null != pageUtils.getMaxMoney()) {
					predicates.add(builder.between(
							root.get("loanApplicationMoney"),
							pageUtils.getMinMoney(), pageUtils.getMaxMoney()));
				}
				query.where(predicates.toArray(new Predicate[predicates.size()]));
				return null;
			}

		}, pageRequest);

	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值