Hibernate HQL示例二:list与iterate的区别

本文通过示例对比了Hibernate中list与iterate方法在查询性能上的区别,list方法每次都会查询所有对象,而iterate方法先查询ID列表,按需加载实体,有助于减少n+1查询问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例演示查询list与iterate的区别

1、实体对象的查询,查询的是实体对象的数据【重要】
  * n+1问题,在默认配置的情况下,使用query.iterate()操作,有可能有n+1问题,所谓
  n+1,指在查询对象数据的时候,发出了n+1条查询语句。
  1:首先发出了一条查询语句,查询对象的id列表
  n:在迭代访问每个对象的时候,如果缓存中没有对象数据,Hibernate会在此发出一条查询语句,
     查询相应的对象 
  
  *List操作与Iterate操作的区别
   list,每次都会发出一条查询语句,查询所有的对象
   iterate,首先发出一条查询语句,查询对象的id列表,然后根据缓存情况,决定
    是否发出更多的查询语句,来查询对象数据

 查看下面的代码:

package com.bjsxt.hibernate;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import junit.framework.TestCase;

/**
 * 对象查询中的list操作和iterator操作的差异
 * @author Administrator
 *
 */
public class SimpleObjectQueryTest2 extends TestCase {
	
	public void testQueryWithListMethod() {
			Session session = null;
			try {
				session = HibernateUtils.getSession();
				
				/**
				 * 将发出一条查询语句,获取Student的集合数据
				 * select student0_.id as id1_, student0_.name as name1_, 
				 * student0_.createTime as createTime1_, student0_.classid as classid1_ 
				 * from t_student student0_
				 */
				List students = session.createQuery("from Student").list();
				for (Iterator iter = students.iterator();iter.hasNext();) {
					Student student = (Student)iter.next();
					System.out.println(student.getName());
				}
			}catch(Exception e) {
				e.printStackTrace();
			}finally {
				HibernateUtils.closeSession(session);
			}	
		}		
	
	public void testQueryWithIterateMethod() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			
			//先发出查询id的列表语句
			//select student0_.id as col_0_0_ from t_student student0_
			//再依次发出查询对象的sql(根据id)
			//select student0_.id as id1_0_, student0_.name as name1_0_, 
			//student0_.createTime as createTime1_0_, student0_.classid as classid1_0_ 
			//from t_student student0_ where student0_.id=?
			Query query = session.createQuery("from Student");
			Iterator students = query.iterate();
			while (students.hasNext()) {
				Student student = (Student)students.next();
				System.out.println(student.getName());
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}	
	
	public void testQueryWithListAndIterate() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			Query query = session.createQuery("from Student");
			List students = query.list();
			for (Iterator iter = students.iterator();iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			
			//如果使用iterate进行查询
			//因为list操作已经将对象加载到了session的一级缓存,所以
			//再使用iterate操作的时候,它先会发出查询id列表的查询语句
			//再根据id到缓存中获取相关的数据
			//只有再缓存中找不到相关数据的情况下,才会再次发出sql进行查询
			Iterator studentsIter = query.iterate();
			while (studentsIter.hasNext()) {
				Student student = (Student)studentsIter.next();
				System.out.println(student.getName());
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}	
		
	}
	
	public void testQueryWithListAndList() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			Query query = session.createQuery("from Student");
			List students = query.list();
			for (Iterator iter = students.iterator();iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			
			//再次发出发出sql
			//在默认情况下,list每次都会向数据库发出查询对象数据的sql,
			//除非配置了查询缓存,所以下面的list()操作,虽然在session已经有了
			//对象缓存数据,但list()并不理会这个中缓存,而再次发出查询语句进行查询
			students = query.list();
			for (Iterator iter = students.iterator();iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}
	
	
}

 

 

详细查看注释部分代码.

以后对查询的性能优化..

基于数据挖掘的音乐推荐系统设计实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值