Hibernate通过sql分页查询出现重复有关问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
Hibernate通过sql分页查询出现重复问题
Java code
// 分页方法
public List getMoreSql(String hql, Pager pager) {
if (pager == null)
pager = new Pager();
String sortStr = ;
int sortIndex = hql.indexOf( order by );
if (sortIndex 0) {
sortStr = hql.substring(sortIndex + 8).trim();//截取order by 以后的字符串 ,即排序的字段
hql = hql.substring(0, sortIndex);//截取order by 以前的字符串
}
if (null != pager.getSortStr() ! .equals(pager.getSortStr()))
sortStr = pager.getSortStr();
pager.setSortStr(sortStr);
String newSql = ;
if ( .equals(sortStr))
newSql = hql; //无排序字段
else
newSql = hql + order by + sortStr;//有排序字段
Session session = getSession();
String str = newSql.substring(newSql.indexOf( from ));//截取from 开始到最后的所有字符,为查询总共的行数
int count = calCountSql(hql);//总共的行数
pager.setRows(count);//设置行数
int limit = 0;//当前查询的起始行数
if (pager.getPageIndex() 0)
limit = pager.getPageSize() * (pager.getPageIn
if (pager.getPageIndex() pager.getPageCounts()) {
limit = pager.getPageSize() * (pager.getPageCounts() - 1);
pager.setPageIndex(pager.getPageCounts());
}
limit = limit 0 ? 0 : limit;
List list =
session.createSQLQuery(newSql).setFirstResult(limit).setMaxResults(pager.getPage
Size()).list();
releaseSession(session);
return list;
}
// 分页对象
package hzl.input.util;
public class Pager {
/**总行数*/
private int rows;
/**总页数*/
private int pageCounts;
/**第几页*/
private int pageIndex;
/**每页显示行数*/
private int pageSize;
private String pageStr;
/**排序字段*/
private String sortStr;
public Pager() {
super();
this.rows = 0;
this.pageCounts = 0;
this.pageIndex = 1;
this.pageSize = 8;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getPageCounts() {
pageCounts = getRows() / getPageSize() + ((getRows() % pageSize) 0 ? 1 :
0);
pageCounts = pageCounts 1 ? 1 : pageCounts;
return pageCounts;
}
public void setPageCounts(int pageCounts) {
this.pageCounts = pageCounts;
}
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public String getSortStr() {
return sortStr;
}
public void setSortStr(String sortStr) {
this.sortStr = sortStr;
}
}
上面是自己写的sql分页查询方法,但是发现在执行的过程中出现问题,到第4、5页的时候会出现重复的记录,以后的每一页也都会重复出现固定条数的记录,但是记录总数量和当前页数都是对的
哪一位大侠给指点指点,上面的代码哪里有问题~先谢谢了
------解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
--------------------------------------------------------
再加一个排序,
应该是那个字段那里的值为空或者都是一样的,
你就再加上一个排序, 如 ID, 肯定就会不一样了
------解决方案--------------------------------------------------------
newSql = hql + order by + sortStr;//有排序字段
你就在这里 sortStr, 加上一个字段咯,
newSql = hql + order by + sortStr + , id desc ;//有排序字段
------解决方案--------------------------------------------------------
应该是那个字段那里的值为空或者都是一样的,
例如, 按分数高低排,
80分的有40个人, 但是, 你那设置分页的是10条
所以这一段就至少有4页, 而这里你又没有再设置其它的排序方式,
所以它这里就自动先出来一些, 你分页的时候, 它也就先找原来出来的那些数据咯,
一直到, 这边界外, 才会出现其它的数据
------解决方案--------------------------------------------------------
前些日子项目中我也遇到这个问题,问下LZ用的SQL Server数据库并且有多个外连接查询,
如果那样的话我知道原因,那是因为sql server 使用top来进行数据分页的,而hibernate生成的语句只对第一个查询运行top