You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis 3 SQL Builder类如何使用ORDER BY DESC/ASC排序?

MyBatis 3 SQL Builder实现ORDER BY DESC/ASC排序

问题场景

已使用MyBatis 3的SQL Builder类编写查询逻辑,但不知道如何为ORDER BY子句添加DESC/ASC排序关键字,当前代码如下:

public String selectPersonLike(final String id, final String firstName, final String lastName) {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
    FROM("PERSON P");
    if (id != null) {
      WHERE("P.ID like #{id}");
    }
    if (firstName != null) {
      WHERE("P.FIRST_NAME like #{firstName}");
    }
    if (lastName != null) {
      WHERE("P.LAST_NAME like #{lastName}");
    }
    ORDER_BY("P.LAST_NAME");
  }}.toString();
}

期望生成的SQL语句为:

SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME FROM PERSON P ORDER BY P.LAST_NAME DESC

解决方案

SQL Builder的ORDER_BY()方法支持直接在字段名后拼接DESC或ASC关键字,无需额外特殊处理:

  1. 固定排序方向
    直接修改ORDER_BY行的参数,添加排序关键字即可:
public String selectPersonLike(final String id, final String firstName, final String lastName) {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
    FROM("PERSON P");
    if (id != null) {
      WHERE("P.ID like #{id}");
    }
    if (firstName != null) {
      WHERE("P.FIRST_NAME like #{firstName}");
    }
    if (lastName != null) {
      WHERE("P.LAST_NAME like #{lastName}");
    }
    // 直接在字段后添加DESC
    ORDER_BY("P.LAST_NAME DESC");
  }}.toString();
}

这样生成的SQL就会包含ORDER BY P.LAST_NAME DESC,满足需求。

  1. 动态控制排序方向
    如果需要根据业务场景动态切换DESC/ASC,可以在方法中添加排序方向参数,拼接进ORDER_BY的参数中:
public String selectPersonLike(final String id, final String firstName, final String lastName, final String sortOrder) {
  // 校验排序方向合法性,防止SQL注入
  String validSortOrder = "ASC".equalsIgnoreCase(sortOrder) || "DESC".equalsIgnoreCase(sortOrder) ? sortOrder.toUpperCase() : "ASC";
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
    FROM("PERSON P");
    if (id != null) {
      WHERE("P.ID like #{id}");
    }
    if (firstName != null) {
      WHERE("P.FIRST_NAME like #{firstName}");
    }
    if (lastName != null) {
      WHERE("P.LAST_NAME like #{lastName}");
    }
    // 动态拼接排序方向
    ORDER_BY("P.LAST_NAME " + validSortOrder);
  }}.toString();
}

注意:务必对传入的sortOrder参数做合法性校验,只允许ASC/DESC两种值,避免SQL注入风险。

内容的提问来源于stack exchange,提问作者fairy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:09:24