diff --git a/src/com/wentch/redkale/source/EntityInfo.java b/src/com/wentch/redkale/source/EntityInfo.java index 5469e889a..3e4507f6b 100644 --- a/src/com/wentch/redkale/source/EntityInfo.java +++ b/src/com/wentch/redkale/source/EntityInfo.java @@ -68,6 +68,10 @@ public final class EntityInfo { private final int logLevel; + private final Map sortOrderbySqls = new ConcurrentHashMap<>(); + + private final Map> sortComparators = new ConcurrentHashMap<>(); + //---------------------计算主键值---------------------------- private final int nodeid; @@ -277,6 +281,22 @@ public final class EntityInfo { return this.aliasmap == null; } + public String getSortOrderbySql(String sort) { + return this.sortOrderbySqls.get(sort); + } + + protected void putSortOrderbySql(String sort, String sql) { + this.sortOrderbySqls.put(sort, sql); + } + + public Comparator getSortComparator(String sort) { + return this.sortComparators.get(sort); + } + + protected void putSortComparator(String sort, Comparator comparator) { + this.sortComparators.put(sort, comparator); + } + //根据field字段名获取数据库对应的字段名 public String getSQLColumn(String fieldname) { return this.aliasmap == null ? fieldname : aliasmap.getOrDefault(fieldname, fieldname); diff --git a/src/com/wentch/redkale/source/FilterNode.java b/src/com/wentch/redkale/source/FilterNode.java index 3569f3d3b..19956553c 100644 --- a/src/com/wentch/redkale/source/FilterNode.java +++ b/src/com/wentch/redkale/source/FilterNode.java @@ -209,13 +209,16 @@ public class FilterNode { protected static String createFilterSQLOrderBy(EntityInfo info, Flipper flipper) { if (flipper == null || flipper.getSort() == null || flipper.getSort().isEmpty()) return ""; + final String sort = flipper.getSort(); + String sql = info.getSortOrderbySql(sort); + if (sql != null) return sql; final StringBuilder sb = new StringBuilder(); sb.append(" ORDER BY "); if (info.isNoAlias()) { - sb.append(flipper.getSort()); + sb.append(sort); } else { boolean flag = false; - for (String item : flipper.getSort().split(",")) { + for (String item : sort.split(",")) { if (item.isEmpty()) continue; String[] sub = item.split("\\s+"); if (flag) sb.append(','); @@ -227,7 +230,9 @@ public class FilterNode { flag = true; } } - return sb.toString(); + sql = sb.toString(); + info.putSortOrderbySql(sort, sql); + return sql; } protected Predicate createFilterPredicate(final EntityInfo info, FilterBean bean) { @@ -755,8 +760,10 @@ public class FilterNode { protected static Comparator createFilterComparator(EntityInfo info, Flipper flipper) { if (flipper == null || flipper.getSort() == null || flipper.getSort().isEmpty()) return null; - Comparator comparator = null; - for (String item : flipper.getSort().split(",")) { + final String sort = flipper.getSort(); + Comparator comparator = info.getSortComparator(sort); + if (comparator != null) return comparator; + for (String item : sort.split(",")) { if (item.trim().isEmpty()) continue; String[] sub = item.trim().split("\\s+"); int pos = sub[0].indexOf('('); @@ -903,6 +910,7 @@ public class FilterNode { comparator = comparator.thenComparing(c); } } + info.putSortComparator(sort, comparator); return comparator; }