当前使用版本(必须填写清楚,否则不予处理)
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