分页查询:时间筛选+日期筛选+增加queryWrapper 筛选条件
文章结构建议:
1. 引言
- 介绍实际业务场景:银行诉讼提醒系统
- 需要实现的功能:分页查询 + 复杂条件过滤
2. 核心代码分析
2.1 Controller层 - REST API入口
@GetMapping("/page")
@Operation(summary = "获得诉讼提醒分页")
@PreAuthorize("@ss.hasPermission('bank:remind-lawsuit:query')")
public CommonResult<PageResult<RemindLawsuitRespVO>> getRemindLawsuitPage(@Valid RemindLawsuitPageReqVO pageReqVO) {PageResult<RemindLawsuitRespVO> pageResult = remindLawsuitService.getRemindLawsuitPage(pageReqVO);return success(pageResult);
}
关键点分析:
- 使用Swagger注解
@Operation
进行API文档说明 - 权限控制
@PreAuthorize
确保安全访问 - 参数校验
@Valid
保证数据完整性 接收请求参数
pageReqVO
。调用 Service,返回分页数据。
用
CommonResult
包装统一响应。
2.2 Service层 - 业务逻辑处理
@Override
public PageResult<RemindLawsuitRespVO> getRemindLawsuitPage(RemindLawsuitPageReqVO pageReqVO) {LambdaQueryWrapperX<RemindLawsuitDO> queryWrapper = new LambdaQueryWrapperX<RemindLawsuitDO>().eqIfPresent(RemindLawsuitDO::getCustCode, pageReqVO.getCustCode()).likeIfPresent(RemindLawsuitDO::getCustName, pageReqVO.getCustName()).likeIfPresent(RemindLawsuitDO::getDeptName, pageReqVO.getDeptName()).eqIfPresent(RemindLawsuitDO::getCustType, pageReqVO.getCustType()).betweenIfPresent(RemindLawsuitDO::getRemindTime, pageReqVO.getRemindTime());addOverdueTimeCondition(queryWrapper, pageReqVO);IPage<RemindLawsuitRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());page = remindLawsuitMapper.getRemindLawsuitPage(page, queryWrapper);return new PageResult<>(page.getRecords(), page.getTotal());
}
技术亮点:
- 使用
LambdaQueryWrapperX
链式调用,代码简洁易读 eqIfPresent
、likeIfPresent
等方法避免空值判断- 将复杂条件封装到独立方法中,提高代码可维护性
LambdaQueryWrapperX
用来拼接动态条件(只有参数不为空才生效)。addOverdueTimeCondition
封装了“逾期 1-30 天 / 31-90 天 / 90 天以上”的条件。最终调用
remindLawsuitMapper.getRemindLawsuitPage
执行分页。
2.3 复杂条件处理 - 逾期时间分段查询
private void addOverdueTimeCondition(LambdaQueryWrapperX<RemindLawsuitDO> queryWrapper, RemindLawsuitPageReqVO pageReqVO) {if (pageReqVO.getKey() != null && pageReqVO.getKey() > 0) {if (1 == pageReqVO.getKey()) {// 1-30天逾期LocalDateTime[] timeRange = get1_30();queryWrapper.between(RemindLawsuitDO::getExpireTime, timeRange[0], timeRange[1]);} else if (31 == pageReqVO.getKey()) {// 31-90天逾期LocalDateTime[] timeRange = get31_90();queryWrapper.between(RemindLawsuitDO::getExpireTime, timeRange[0], timeRange[1]);} else if (90 == pageReqVO.getKey()) {// 90天以上逾期queryWrapper.lt(RemindLawsuitDO::getExpireTime, get90_());}}
}
2.4 Mapper层 - XML配置
IPage<RemindLawsuitRespVO> getRemindLawsuitPage(IPage<RemindLawsuitRespVO> page,
@Param("ew") LambdaQueryWrapper<RemindLawsuitDO> queryWrapper);
<select id="getRemindLawsuitPage"resultType="com....controller.admin.remindlawsuit.vo.RemindLawsuitRespVO">selectm.*from ux_remind_lawsuit mWHERE 1 = 1<if test="ew != null"><if test="ew.sqlSegment != null"><if test="ew.sqlSegment != ''">AND ${ew.sqlSegment}</if></if></if>and m.deleted = 0ORDER BY m.remind_time ASC, m.id DESC
</select>
3. 技术要点总结
3.1 设计模式应用
- Builder模式:LambdaQueryWrapperX的链式调用
- 策略模式:不同逾期时间段的查询策略
3.2 最佳实践
- 条件查询使用
xxxIfPresent
避免空值处理 - 分页查询与业务逻辑分离
- 复杂条件封装提高代码可读性
3.3 性能优化考虑
- 数据库索引优化(remind_time, expire_time等字段)
- 软删除机制(deleted = 0)
4. 扩展思考
- 如何处理更复杂的动态查询条件
- 分页查询的缓存策略
- 大数据量下的分页性能优化
5. 总结
这套代码体现了企业级应用开发中的常见模式,具有很好的参考价值。