zoukankan      html  css  js  c++  java
  • hibernate中Query的list和iterator区别

    1、Test_query_list类

    public class Test_query_iterator_list {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
            Session session=sessionFactory.openSession();        
            String hql="from User where id<=3";
            List<User> users=session.createQuery(hql).list();
            System.out.println("***************************************");
            for (User user: users) {
                System.out.println(user);
            }       
            session.close();       
        }
    
    }

    测试结果为:

    Hibernate:
    select
    user0_.id as id0_,
    user0_.name as name0_
    from
    mydb.user user0_
    where
    user0_.id<=3
    ***************************************
    User [id=1, name=LI]
    User [id=2, name=sara2]
    User [id=3, name=sara3]

    public class Test_query_iterator_list {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
            Session session=sessionFactory.openSession();            
            String hql="from User where id<=3";
            Iterator<User> iterator=session.createQuery(hql).iterate();
            System.out.println("***************************************");
            while(iterator.hasNext()) {
                System.out.println(iterator.next());
            }        
            session.close();        
        }
    }

    输出结果为:

    Hibernate:
    select
    user0_.id as col_0_0_
    from
    mydb.user user0_
    where
    user0_.id<=3
    ***************************************
    Hibernate:
    select
    user0_.id as id0_0_,
    user0_.name as name0_0_
    from
    mydb.user user0_
    where
    user0_.id=?
    User [id=1, name=LI]
    Hibernate:
    select
    user0_.id as id0_0_,
    user0_.name as name0_0_
    from
    mydb.user user0_
    where
    user0_.id=?
    User [id=2, name=sara2]
    Hibernate:
    select
    user0_.id as id0_0_,
    user0_.name as name0_0_
    from
    mydb.user user0_
    where
    user0_.id=?
    User [id=3, name=sara3]

    结论:

      可以看出list每次都是通过一条语句直接操作数据库取出所有的数据返回(并且将对象存入hibernate缓存);iterator首先通过一条语句取出所有数据的id,然后通过id在hibernate的一级缓存中查找是否存在该对象,如果存在则直接取出,如果没有则再次发出一条sql语句通过id取得对象(并且加入到缓存中),这样如果所有的id在缓存中都没有的话就会出现n+1条sql语句的问题。

  • 相关阅读:
    java子类重写父类的要点
    转:swing 中paint与paintComponent的区别(jcomponent)
    证明二叉查找树所有节点的平均深度为O(logN)
    O(logN)中logN的底数
    Stanford依存句法关系解释
    java中的interface
    转:java中Vector的使用
    final类与final方法
    转:NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)
    英文语法分析树标注集
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/5656030.html
Copyright © 2011-2022 走看看