日期:2014-05-20  浏览次数:20707 次

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.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