如何将String上的PageRequest排序为数值

Joe*_*jah 7 java spring spring-data-jpa

我目前有一个系统,可以过滤和排序数据库中的记录,并将它们作为分页对象返回.其中一条线是这样的:

final PageRequest request = new PageRequest(this.pagingSettings.getPageNumber(),
            this.pagingSettings.getPageSize(), sortDirection, sortedBy);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但现在我有以下情况.我正在尝试对门牌号码进行排序,这是我的Postgres数据库中的varchar.例如,我们有1个,12个,111个,1004个,但也有1A或36个BASEMENT.对这些(字符)值进行排序时,这些值将排序:1,1004,111,12,1A,......

所以,sortedBy现在是一个String,在这种情况下是houseNumber.我发现使用Postgres中的ORDER BY参数... ORDER BY NULLIF(regexp_replace(container_number, E'\\D', '', 'g'), '')::int";,排序就像我想要的那样:1,1A,12,111,......

但是,只是将sortedByString 更改为sortedBy = "NULLIF(regexp_replace(container_number, E'\\D', '', 'g'), '')::int";似乎不起作用.

有没有人建议如何在不更改数据库的情况下对PageRequest数字中的字符值进行排序?

xen*_*ros 3

所以基本上你需要做两件事:

  1. 实现自定义比较器,
  2. 注释实体类。

广告1。

public class HouseComparator implements Comparator<House> {
    @Override
    public int compare(House h1, House h2) {

        String s1 = h1.getHouseNumber().split("[^0-9]")[0];
        String s2 = h2.getHouseNumber().split("[^0-9]")[0];

        return s1.compareTo(s2);
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要对案件进行一些更好的处理。上面的比较器表示,它h1小于h2以较小数字开头的值,反之亦然。因为这个比较器12A是相等的12B,但这取决于你。

广告2。

@SortComparator(HouseComparator.class)
List<House> findByHouseNumber(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)