首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

Hibernate通过sql分页查询出现重复有关问题

2012-01-13 
Hibernate通过sql分页查询出现重复问题Java code// 分页方法public List getMoreSql(String hql, Pager pa

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


[解决办法]
我之前一个项目也遇到过。可以肯定的是数据有重复。。。。。把我搞了好久才发现这个问题
[解决办法]
这是hibernate自身机制决定的
hibernate分页只是简单的利用数据库的机制
比如oracle 的rownum
要想正确,还是要自己去实现,才能够消除可能存在的错误
[解决办法]

探讨
这是hibernate自身机制决定的
hibernate分页只是简单的利用数据库的机制
比如oracle 的rownum
要想正确,还是要自己去实现,才能够消除可能存在的错误

热点排行