【问题标题】:Pagination and Sorting - custom sorting of data分页和排序 - 数据的自定义排序
【发布时间】:2022-04-10 17:12:12
【问题描述】:

我的项目中的数据排序有问题。

由于我实现了分页,我不知道如何解决这个问题。

在分页之前,我获取了整个实体列表并按此类排序:

    public class EntitySorter {

    private static final Logger LOG = Logger.getLogger(EntitySorter.class);

    public static int sort(String s1, String s2) {
        if (StringUtils.isBlank(s1) || StringUtils.isBlank(s2)) {
            return -1;
        }
        if (!s1.contains("/") || !s2.contains("/")) {
            return -1;
        }
        if (s1.substring(s1.lastIndexOf("/") + 1).length() != 4 ||
                s2.substring(s2.lastIndexOf("/") + 1).length() != 4) {
            return -1;
        }

        final String year1 = s1.substring(s1.lastIndexOf("/") + 1);
        final String year2 = s2.substring(s2.lastIndexOf("/") + 1);

        if (!NumberUtils.isDigits(year1) || !NumberUtils.isDigits(year2)) {
            return -1;
        }

        final int result = NumberUtils.toInt(year1) - NumberUtils.toInt(year2);

        if (result != 0) {
            return result;
        }

        final String caseNumber1 = s1.substring(0, s1.indexOf("/"));
        final String caseNumber2 = s2.substring(0, s2.indexOf("/"));

        if (!NumberUtils.isDigits(caseNumber1) && NumberUtils.isDigits(caseNumber2)) {
            try {
                final int intCaseNumber1 = Integer.parseInt(caseNumber1.replaceAll("[^0-9]", ""));
                return intCaseNumber1 - Integer.parseInt(caseNumber2);
            } catch (NumberFormatException e) {
                LOG.error(e.getMessage(), e);
            }
            return -1;
        }
        if (NumberUtils.isDigits(caseNumber1) && !NumberUtils.isDigits(caseNumber2)) {
            try {
                final int intCaseNumber2 = Integer.parseInt(caseNumber2.replaceAll("[^0-9]", ""));
                return Integer.parseInt(caseNumber1) - intCaseNumber2;
            } catch (NumberFormatException e) {
                LOG.error(e.getMessage(), e);
            }
            return -1;
        }
        if (!NumberUtils.isDigits(caseNumber1) && !NumberUtils.isDigits(caseNumber2)) {
            try {
                final int intCaseNumber1 = Integer.parseInt(caseNumber1.replaceAll("[^0-9]", ""));
                final int intCaseNumber2 = Integer.parseInt(caseNumber2.replaceAll("[^0-9]", ""));
                return intCaseNumber1 - intCaseNumber2;
            } catch (NumberFormatException e) {
                LOG.error(e.getMessage(), e);
            }
            return -1;
        }

        return NumberUtils.toInt(caseNumber1) - NumberUtils.toInt(caseNumber2);
    }
}

我们举个例子:

我们有一个 ID 列表:

101/2021
102/2021
1/2022
86/2020

正确的排序列表是:

1/2022
102/2021
101/2021
86/2020

在数据库中,此 ID 为一列。它不分为数字和年份。我尝试使用 Sort.by() 但没有成功。如何使用分页并保持正确的排序?

【问题讨论】:

    标签: spring database sorting pagination


    【解决方案1】:

    为了使分页以最佳方式工作,应正确索引数据..

    如果您可以在一列中使用不同的数据表示形式,那么这是最好的方法。

    如果不是,那么简单的方法就是将一列分解为多列,创建多列索引并按这些列排序 + 您需要了解列的自然顺序是否符合您的逻辑。

    困难的方法是创建用户定义的函数和索引以及其他解决方案,但我会避免不必要的复杂性。

    保持简单!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2011-05-10
      相关资源
      最近更新 更多