hibernate缓存失效?求教!

在学习hibernate的时候发现只要在session.createQuery("from Student").list 中加上.setFirstResult(0).setMaxResults(50) 就会发生N+1问题。

这个是我的一级缓存测试代码: HibernateUtil是把SessionFactory跟session包装起来了。

    public void Test04(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            List<Student> ls = session.createQuery("select stu from Student stu ")
                    .setFirstResult(0).setMaxResults(100).list();
            Iterator<Student> stus = ls.iterator();
            for(;stus.hasNext();){
                Student stu = stus.next();
                System.out.println(stu.getName());
            }
            stus = session.createQuery("select stu from Student stu ").setFirstResult(0).setMaxResults(50).iterate();
            while(stus.hasNext()){
                Student stu = stus.next();
                System.out.println(stu.getName());
            }
        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        } finally{
            if(session!=null)
                session.close(); 
        }
    }

本来应该是第一句SQL结束后下面只会执行一条SQL查询到缓存里的ID,然后就输出其他数据,
但结果是每一条数据都要去查询,造成N+1问题。结果如图:
图片说明

之后就是二级缓存也是同样的情况,(ps:就只有查询分页数据的时候有问题,其他都没问题,查询缓存我试过了。所以我就不放二级缓存的配置了。)
代码如下:

    public void Test05(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            List<Student> stus = session.createQuery(" from Student ")
                    .setFirstResult(0).setMaxResults(50).list();

        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        } finally{
            if(session!=null)
                session.close(); 
        }

        try {
            session = HibernateUtil.getSession();
            Iterator<Student> ls = session.createQuery("from Student")
                    .setFirstResult(0).setMaxResults(50)
                    .iterate();
                    while(ls.hasNext()){
                        Student stu = ls.next();
                        System.out.println(stu.getName());
                    }
        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        } finally{
            if(session!=null)
                session.close(); 
        }
    }

结果如图:
图片说明

现在的情况是;如果我把.setMaxResults(50)去掉的话就会正常。 或者我使用了
session.createQuery("from Student").setParameter(0, "%张%").setFirstResult(0).setMaxResults(50) 的话,就又会正常运行了。只发了两条SQL, 求教大神们,高手们告之我究竟是哪里出错误?我在网上找了好多题目都找不到原因。

http://blog.csdn.net/leeking888/article/details/7506003