Query的list()和iterate()方法的区别

1.Query接口的list与iterate方法:

iterate()方法:

Return the query results as an Iterator. Ifthe query contains multiple results pre row, the results are returned in aninstance ofObject[].
Entities returned as results are initialized ondemand. The first SQL query returns identifiers only.

(返回的实体只有在使用时才会被初始化,执行该方法查询时只会返回实体的标识符(即id))

list()方法:

Return the query results as a List. If thequery contains multiple results pre row, the results are returned in aninstance ofObject[].

2.两者区别:

对于Query接口的list()方法与iterate()方法来说,都可以实现获取查询的对象,但是list()方法返回的每个对象都是完整的(对象中的每个属性都被表中的字段填充上了),而iterator()方法所返回的对象中仅包含了主键值(标识符),只有当你对iterator中的对象进行操作时,Hibernate才会向数据库再次发送SQL语句来获取该对象的属性值。

3. 例:

 Session session =sessionFactory.openSession();
    
    Transaction tx =null;
    
    //List<People> list = null;
    
    Iterator<People> iter = null;
    
    try
    
    {
    
        tx= session.beginTransaction();
    
       Query query = session.createQuery("from People");

 

    /*使用iterate方法

    Iterator<People> iter = (Iterator<People>)query.iterate();

   

    while(iter.hasNext())

    {

        session.delete(iter.next());

    }

    */

//关于这两种删除数据库中的记录的方式的效率的对比(假如共查到5条记录):

// iterate()方法:执行6条select语句和5条delete语句

//list()方法:执行1条select语句和5条delete语句

// 此时list的效率比较高

//使用list方法

    //list = (List<People>)query.list();

   

//  for(Iterator<People> iter = list.iterator(); iter.hasNext();)

//  {

//      session.delete(iter.next());

//  }

 

//在session关闭之前调用iterate方法在session关闭后再用iter访问people对象以证明iterate方法没有返回完整的对象

iter = (Iterator<People>)query.iterate();

tx.commit();

}catch(Exception ex)

{

    if(null != tx)

    { tx.rollback();}

}finally

{session.close();}

//在session关闭之后就不可能再向数据库发送SQl语句来获取对象的属性(即填充完整对象),则会抛出SessionException异常提示"Session is closed!"

while(iter.hasNext())

{

    System.out.println(iter.next().getId());

}

关于Query接口的其它方法,详见API帮助文档

list()方法无法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询缓存的前提下使用查询缓存;iterate()方法可以充分利用缓存,如果目标数据只读或者读取频繁,使用iterate()方法可以减少性能开销。
② list()方法不会引起N+1查询问题,而iterate()方法可能引起N+1查询问题。

原文地址:http://blog.csdn.net/jialinqiang/article/details/8718437

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值