在学习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, 求教大神们,高手们告之我究竟是哪里出错误?我在网上找了好多题目都找不到原因。