当前使用版本(必须填写清楚,否则不予处理)

3.3.0

该问题是怎么引起的?(最新版上已修复的会直接close掉)

此问题我在3.1.2时提过,但并没有修复掉,看这里#1483 当使用分页插件进行多字段排序时无效(类似这种 ORDER BY account_id ASC, person_id DESC),实际生成的sql为:ORDER BY account_id, person_id DESC

重现步骤

这时分页部分代码

      String[] ascs = getParameterSafeValues(PageCons.PAGE_ASCS);
      List<OrderItem> orderItemList = new ArrayList<>();
      if (ascs != null) {
        for (String name : ascs) {
          orderItemList.add(OrderItem.asc(name));
        }
      }
      String[] descs = getParameterSafeValues(PageCons.PAGE_DESCS);
      if (descs != null) {
        for (String name : descs) {
          orderItemList.add(OrderItem.desc(name));
        }
      }
      page.setOrders(orderItemList);

报错信息

自己动手翻了下源码,在PaginationInterceptor类的addOrderByElements方法中

// 这句是用来设置排序类型的,但如果只使用asc或desc时不会有问题,同时用就不行了
element.setAsc(item.isAsc());
// 需要再加一句,这样就正确了。
element.setAscDescPresent(true);

原因: jsqlparser里的OrderByElement对象的toString方法是最终拼接asc或desc的地方,有个boolean控制是否拼接asc字符串。

    private boolean ascDesc = false;
    ... ...
    @Override
    public String toString() {
        StringBuilder b = new StringBuilder();
        b.append(expression.toString());

        if (!asc) {
            b.append(" DESC");
        } else if (ascDesc) { // 注意这里的判断
            b.append(" ASC");
        }

        if (nullOrdering != null) {
            b.append(' ');
            b.append(nullOrdering == NullOrdering.NULLS_FIRST ? "NULLS FIRST" : "NULLS LAST");
        }
        return b.toString();
    }

最后,我在jsqlparser没有找到这个 ascDesc 的使用说明,如果有了解的同学请告知一下,感谢

Comment From: miemieYaho

使用 3.3.1.5-SNAPSHOT