日期:2014-05-19  浏览次数:20745 次

JPA分页的问题?感觉效率不行
Java code

public List getPersonList(int max, int whichpage) {
        try {
            int index = (whichpage - 1) * max;
            Query query = em.createQuery("from Person p order by personid asc");
            List list = query.setMaxResults(max).setFirstResult(index).getResultList();
            em.clear();// 分离内存中受EntityManager管理的实体bean,让VM进行垃圾回收
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

上面是网上查到JPA分页的例子,发现JPA分页有2个缺陷
1. 类似于上例,用query.setFirstResult(5);query.setMaxResults(2)是想找第5--7条
  虽然结果正确,但看了log中的sql,竟然是select top 7 然后返回第6,7两条。而我们自己写sql则是可通过一定的写法直接返回第6.7条。 如果数据量大JPA且不是要查询装载很多额外的数据?
2. 用该方法查找出来的无法缓存?

请问是这样吗,有没有更好的办法?
如例子中如果不用em.clear会有什么副作用?

------解决方案--------------------
OK,用的sqlserver,让我们来看看hibernate3.3中SqlServerDialect是怎么处理分页的
Java code

    public String getLimitString(String querySelect, int offset, int limit) {
        if ( offset > 0 ) {
            throw new UnsupportedOperationException( "query result offset is not supported" );
        }
        return new StringBuffer( querySelect.length() + 8 )
                .append( querySelect )
                .insert( getAfterSelectInsertPoint( querySelect ), " top " + limit )
                .toString();
    }