在开发过程中,遇到了这样一个场景:collection 中存在某一个字段,这里假设为 age,某些数据的 age 值为 null,进行升序排序时,值为 null 的数据会排在最前面(在许多编程语言和数据库中,null
被视为一个特殊的值,它表示缺失或未知的数据。在排序时,null
通常被认为是最小的值,因此会被排在前面。)。但实际上我们并不关心值为 null 的数据,理想情况下应该在值为非空的数据排序完以后再将值为 null 的数据加到后面,接下来记录两种实现方法,方便以后开发抄作业。
一. 添加测试数据
创建 sortTest 表,并添加几条测试数据,方便测试
二. 代码实现
查询条件有两个参数:
field:用来指定排序的字段
sort:用来判断升序还是降序
接下来记录实现方法,为图方便简化了相关结构
1. controller
import com.alibaba.fastjson.JSONObject;
import com.example.demo.service.TestService;
import com.example.demo.test.Test2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/test")
@CrossOrigin(value = "*", maxAge = 3600)
public class TestController {
@Autowired
private TestService service;
@RequestMapping(value = "/sort", method = RequestMethod.GET)
public List sortList(@RequestBody JSONObject input) {
String field = input.getString("field");
String sort = input.getString("sort");
return service.sortList(field, sort);
}
}
2. service
import com.example.demo.dao.TestImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TestService {
@Autowired
private TestImpl testImpl;
public List sortList(String field, String sort) {
return testImpl.sortList1(field, sort);
}
}
3. respositoryImpl
import com.arangodb.ArangoCursor;
import com.arangodb.springframework.core.ArangoOperations;
import com.arangodb.util.MapBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public class TestImpl {
@Autowired
private ArangoOperations arangoOperations;
//方法1
public List sortList1(String field, String sort) {
StringBuilder query = new StringBuilder("FOR d IN sortTest LET sortValue = d.@field == null ? ");
if (sort.equalsIgnoreCase("ASC")) {
query.append("1 : 0");
} else {
query.append("0 : 1");
}
query.append(" SORT sortValue @sort, d.@field @sort RETURN d");
ArangoCursor<Map> cursor = arangoOperations.query(query.toString(), new MapBuilder().put("field", field).put("sort", sort).get(), Map.class);
return cursor.asListRemaining();
}
//方法2
public List sortList2(String field, String sort) {
String query = "FOR doc IN sortTest\n" +
" SORT doc.@field != null DESC, doc.@field @sort\n" +
" RETURN doc";
ArangoCursor<Map> cursor = arangoOperations.query(query, new MapBuilder().put("field", field).put("sort", sort).get(), Map.class);
return cursor.asListRemaining();
}
}
三. 结果测试