场景
使用 Spring 的 spring-data-commons 这个jar包进行 MongoDB 查询的时候,
在写Sort (package 是 org.springframework.data.domain.Sort) 的时候,遇到了一些坑,
特地记下来
问题
问题是这样的
当排序的时候,可能会遇到同时排序好几个字段的情况
写法有两种,见下面的测试代码
Sort sort = new Sort(Sort.Direction.DESC, "weight");
Sort sort2 = new Sort(Sort.Direction.DESC, "createTime");
//不生效
sort.and(sort2);
System.out.println(sort);
//生效
Sort sort3 = new Sort(Sort.Direction.DESC, "weight").and(sort2);
System.out.println(sort3);
输出如下:
weight: DESC
weight: DESC,createTime: DESC
发现直接用对象and 不生效,只有在new的时候and 才有用
原因
刚开始还以为是BUG,后面想了想特地去看了下源码,看下是怎么回事
public Sort and(Sort sort) {
if (sort == null) {
return this;
}
ArrayList<Order> these = new ArrayList<Order>(this.orders);
for (Order order : sort) {
these.add(order);
}
return new Sort(these);
}
原来 and加入的对象 是存到了返回值那个新对象里,而没有去修改原来的对象,
所以正确用法是
sort = sort.and(sort2);