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数字中的字符值进行排序?
所以基本上你需要做两件事:
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,但这取决于你。
@SortComparator(HouseComparator.class)
List<House> findByHouseNumber(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1840 次 |
| 最近记录: |