用Hibernate分页的时候,当sort的字段里的值基本相等时候,分页的结果会出现数据重复和丢失。
比如没有分页之前顺序是,1,2,3,4,5,6,7,8,9.(其实按照sort字段排序的话,这些数据顺序基本是一样的,就是大部分是不分顺序的。)
分页后就会出现:第一页(1,2,4,),第二页(3,2,5),第三页(7,8,9),其中2重复了,而6丢失了。仔细分析代码后,发现错误在Query的setFirstResult,setMaxResults里。
代码如下:
Query query = entityManager.get().createQuery(q.toString());
for (String key : params.keySet()) {
query.setParameter(key, params.get(key));
}
List queryListA = query.getResultList(); //此语句用来测试,查出来的结果和数据库里吻合。
query.setFirstResult(first);
query.setMaxResults(count); List queryListB = query.getResultList(); //此语句用来测试,当执行了setFirstResult,setMaxResults语句后,问题就会出现。如果sort字段是能够按照一定顺序排序的话,分页没有问题,但是如果sort字段值基本相等,则就会出错。
例如:假设没有分页之前,queryListA里得到的值顺序:1,2,3,4,5,6,7,8,9,10。,那么在执行setFirstResult(0),setMaxResults(4)后,queryListB得到的值:2,1,4,3;而并不是1,2,3,4(随着数据库值不同,得到的结果也不一样)也就是说,setFirstResult(first);setMaxResults(count);后,并不是按照查询出来的结果顺序,从first开始取到count的数据的。实在不知道为什么,请高手指教。
非常感谢。
比如没有分页之前顺序是,1,2,3,4,5,6,7,8,9.(其实按照sort字段排序的话,这些数据顺序基本是一样的,就是大部分是不分顺序的。)
分页后就会出现:第一页(1,2,4,),第二页(3,2,5),第三页(7,8,9),其中2重复了,而6丢失了。仔细分析代码后,发现错误在Query的setFirstResult,setMaxResults里。
代码如下:
Query query = entityManager.get().createQuery(q.toString());
for (String key : params.keySet()) {
query.setParameter(key, params.get(key));
}
List queryListA = query.getResultList(); //此语句用来测试,查出来的结果和数据库里吻合。
query.setFirstResult(first);
query.setMaxResults(count); List queryListB = query.getResultList(); //此语句用来测试,当执行了setFirstResult,setMaxResults语句后,问题就会出现。如果sort字段是能够按照一定顺序排序的话,分页没有问题,但是如果sort字段值基本相等,则就会出错。
例如:假设没有分页之前,queryListA里得到的值顺序:1,2,3,4,5,6,7,8,9,10。,那么在执行setFirstResult(0),setMaxResults(4)后,queryListB得到的值:2,1,4,3;而并不是1,2,3,4(随着数据库值不同,得到的结果也不一样)也就是说,setFirstResult(first);setMaxResults(count);后,并不是按照查询出来的结果顺序,从first开始取到count的数据的。实在不知道为什么,请高手指教。
非常感谢。
解决方案 »
- 默认的dialog的取消和确定是英文的,怎么改成中文的?
- 这段代码是什么意思aa???
- jquery的问题
- 跪问大侠们:AXIS2服务器端对于AXIS的客户端也能用吗?
- JAVA代码调用OFFICE的OCR
- jboss下如何部署jsp及class文件
- [STRUTS] 可否用STRUTS实现左菜单右操作界面的形式?
- 关于Tomcat编译过后是乱码的问题,小妹在这里先谢了
- 为何我的目录下的JSP打不开???
- 求教一个运行效率问题
- java.net.SocketException: Connection reset by peer: socket write error
- 二年的java网站开发经验,求指点发展方向
boolean isFirstClause;
StringBuffer q = new StringBuffer(hql);
if (orderMap != null) {
isFirstClause = true;
for (Map.Entry<String, Boolean> entry : orderMap.entrySet()) {
if (isFirstClause) {
q.append(" order by ");
} else {
q.append(" , ");
}
if (entry.getValue()) {
q.append("obj.").append(entry.getKey()).append(" asc ");
} else {
q.append("obj.").append(entry.getKey()).append(" desc ");
}
isFirstClause = false;
}
}
Query query = entityManager.get().createQuery(q.toString());
for (String key : params.keySet()) {
query.setParameter(key, params.get(key));
}
if (count > 0 && first >= 0) {
query.setFirstResult(first);
query.setMaxResults(count);
}
return query;
}请教高手,万分感谢。
set是无序的,所以你那样肯定就是不按照顺序了
每次查询的顺序都是一样的,但是在
query.setFirstResult(first);
query.setMaxResults(count);
以后,取出来的数据顺序就不一样了。但是如果sort的字段值是有序的话,顺序还是一样的。
isFirstClause = true;
for (Map.Entry <String, Boolean> entry : orderMap.entrySet()) {
if (isFirstClause) {
q.append(" order by ");
} else {
q.append(" , ");
}
if (entry.getValue()) {
q.append("obj.").append(entry.getKey()).append(" asc ");
} else {
q.append("obj.").append(entry.getKey()).append(" desc ");
}
isFirstClause = false;
}
} orderMap != null就是说不是每次都有order by 了
每次排序不一样取的当然不一样。
打印show_sql到后台看看就能明白
程序执行到下面这一句的时候,返回的query结果还是一样的。
Query query = entityManager.get().createQuery(q.toString()); 从setFirstResult(first);setMaxResults(count);执行后,结果就不一样了。难道是说,执行完setFirstResult(first);setMaxResults(count);这个语句后,
后面又执行了一次sql查询???
并不是将查询出来的结果,直接从first开始取count条??
不管到第几页语句应该统一
</set>
</set>
或者直接在hql中写order by 语句,注意order by的内容要非空