业务情景:
一个列表页面,页面字段来源多表,查询逻辑略复杂,原来一直以主表某个字段排序,做查询的时候就排序做分页查询了即可
现在现场提个需求要用附表字段做排序,当前的逻辑没法在查询里实现排序,我就想查出来所有,再排序,再手动分页。
然后我给实体加了implements Comparable<Entity>, 添加排序方法
@Override
public int compareTo(Entity o) {
return this.backDate.compareTo(o.getBackDate());
}
对查询出来的list结果 排序
Collections.sort(list, new Comparator<Entity>() {
@Override
public int compare(Entity o1, Entity o2) {
//降序
return o2.getBackDate().compareTo(o1.getBackDate());
}
});
后边再截取分页。 我本地测试也没问题,但是提交到现场运行报错了
报错日志:
------------>反射调用接口服务名:thirdPartyService.sendUserPendingToOA;busiId:40
2885bd71aa39970171f886a44500c1
http://192.168.5.118/
net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1
at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:499)
at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:972)
at net.sf.json.JSONObject._fromString(JSONObject.java:1201)
at net.sf.json.JSONObject.fromObject(JSONObject.java:165)
at net.sf.json.JSONObject.fromObject(JSONObject.java:134)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:269)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB
ean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:32
2)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJob
Bean.java:112)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.j
ava:525)
看了一圈没看出来这错误和我修改的有什么关系,考虑是其它业务功能有使用反射,对我的修改的功能反射调用,而我也没大改什么,可能就是那个排序的问题。
删掉那段Collections.sort(list, new Comparator<Entity>() 代码再发现场测试,果然不出错了。这种情况第一次遇见,想了半天没明白,只好头疼医头,脚疼医脚,对查询结果list 排序不再用集合的排序,而是转成数组,手动冒泡排序,改完之后测试 果然好了。