mybatis-mapper / mapper

MyBatis Mapper
https://mapper.mybatis.io
Apache License 2.0
340 stars 50 forks source link

Example使用多个orderBy时, SQL生成错误 #8

Closed CodingZx closed 2 years ago

CodingZx commented 3 years ago

使用方式: var exam = new Example(); exam.orderBy(TestEntity::getCreateTime, Example.Order.DESC); exam.orderBy(TestEntity::getId, Example.Order.DESC);

当使用两个以上的orderBy时, 生成SQL会变成 select ... from ... ORDER BY create_time DESCid DESC 只能使用exam.setOrderByClause("create_time desc, id desc") 替换. 希望能增加多字段(FN)方式排序功能

abel533 commented 3 years ago

bug已处理,增加两个方法,国庆期间发布下个版本:

/**
   * 通过方法引用方式设置排序字段
   *
   * @param fn    排序列的方法引用
   * @param order 排序方式
   * @return Example
   */
  public Example<T> orderBy(Fn<T, Object> fn, Order order) {
    if (orderByClause == null) {
      orderByClause = "";
    } else {
      orderByClause += ", ";
    }
    orderByClause += fn.toColumn() + " " + order;
    return this;
  }

  /**
   * 通过方法引用方式设置排序字段,升序排序
   *
   * @param fns 排序列的方法引用
   * @return Example
   */
  public Example<T> orderByAsc(Fn<T, Object>... fns) {
    if (fns != null && fns.length > 0) {
      for (int i = 0; i < fns.length; i++) {
        orderBy(fns[i], Order.ASC);
      }
    }
    return this;
  }

  /**
   * 通过方法引用方式设置排序字段,降序排序
   *
   * @param fns 排序列的方法引用
   * @return Example
   */
  public Example<T> orderByDesc(Fn<T, Object>... fns) {
    if (fns != null && fns.length > 0) {
      for (int i = 0; i < fns.length; i++) {
        orderBy(fns[i], Order.DESC);
      }
    }
    return this;
  }

测试代码:

example.clear();
example.orderBy(User::getId, Example.Order.DESC);
example.orderBy(User::getSex, Example.Order.ASC);
example.setEndSql("limit 1");
user = exampleMapper.selectOneByExample(example);
Assert.assertTrue(user.isPresent());
Assert.assertEquals("韩千叶", user.get().getUserName());

example.clear();
example.orderByDesc(User::getId, User::getSex);
example.setEndSql("limit 1");
user = exampleMapper.selectOneByExample(example);
Assert.assertTrue(user.isPresent());
Assert.assertEquals("韩千叶", user.get().getUserName());
ydq commented 2 years ago

@abel533 作者您好呀,修复的新版本什么时候能发布呀,准备在公司直接使用这个新版mapper上生产了

abel533 commented 2 years ago

国庆期间主要时间都用在了分页插件上,最近会先发布一个版本处理这个bug。

abel533 commented 2 years ago

今天发布新版本。

ydq commented 2 years ago

今天发布新版本。

@abel533

之前我本地 build 过,所以以为是好了,结果今天发现 好像 1.0.2 版本推送没有包含这部分的修改?

是不是推错分支了呀?中央仓库的 1.0.2 版本 依旧有 ORDER BY 的问题呢

abel533 commented 2 years ago

@ydq 看着确实不是新的。。等合并develop后,再发个1.0.3

abel533 commented 2 years ago

1.0.3已发布