Hibernate通过sql分页查询出现重复有关问题
Hibernate通过sql分页查询出现重复问题
上面是自己写的sql分页查询方法,但是发现在执行的过程中出现问题,到第4、5页的时候会出现重复的记录,以后的每一页也都会重复出现固定条数的记录,但是记录总数量和当前页数都是对的
哪一位大侠给指点指点,上面的代码哪里有问题!先谢谢了
------解决方案--------------------
再加一个排序,
应该是那个字段那里的值为空或者都是一样的,
你就再加上一个排序, 如 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
- 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.getPageSize()).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页的时候会出现重复的记录,以后的每一页也都会重复出现固定条数的记录,但是记录总数量和当前页数都是对的
哪一位大侠给指点指点,上面的代码哪里有问题!先谢谢了
------解决方案--------------------
再加一个排序,
应该是那个字段那里的值为空或者都是一样的,
你就再加上一个排序, 如 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