如何用 querywrapper写sql的置顶排序

测试前调试建议

  1. 运行以下 SQL 查看每条记录的实际排序值:

sql

java 复制代码
SELECT 
  *,
  DATEDIFF(NOW(), create_time) AS days_diff,
  IF(DATEDIFF(NOW(), create_time) > 10 AND STATUS != '2', 0, 1) AS top_flag
FROM t_cm_complaint
WHERE is_delete = 0
ORDER BY top_flag ASC, create_time DESC;
  1. 检查 create_time 字段的数据类型和实际值,确保时间计算准确。

  2. 如果需要更精确的时间判断,可以使用 TIMESTAMPDIFF 函数:

    IF(TIMESTAMPDIFF(HOUR, create_time, NOW()) > 240 AND STATUS != '2', 0, 1) ASC

最终我的sql这么写

java 复制代码
/**
	 * 平台统一投诉管理表 分页 (超过十天未办结的工单需要置顶显示)
	 */
	@GetMapping("/list")
	@ApiOperationSupport(order = 2)
	@Operation(summary = "分页", description  = "传入cmComplaint")
	public R<IPage<CmComplaintVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> cmComplaint, Query query) {
		// 去掉默认排序条件
		query.setDescs(null);
		QueryWrapper<CmComplaintEntity> queryWrapper = Condition.getQueryWrapper(cmComplaint, CmComplaintEntity.class);
		// 添加置顶排序条件:超过10天未办结的工单排在最前
		queryWrapper.last("ORDER BY IF(DATEDIFF(NOW(), create_time) > 10 AND status != '2', 0, 1) ASC, create_time DESC");
		IPage<CmComplaintEntity> pages = cmComplaintService.page(Condition.getPage(query), queryWrapper);
		return R.data(CmComplaintWrapper.build().pageVO(pages));
	}