Hibernate中用hql通过query进行查询的时候,通常会用list或者iterate取得查询到的结果.在此简单说明一下这两个方法的不同之处和适用场景.
List:查询到的结果会被完整地放进内存(session的缓存),实体会处于持久状态.如果用迫切连接(fetch)模式,取得的结果可能会存在主表对应的一条记录会在list里存在多个实例(准确的讲是实例引用),多次出现但是指向同一个对象.list只会执行一条SQL语句.
Iterate:会在第一次把所有的id查询出来,然后在真正iterate的时候,根据session的缓存中是否存在对应的对象而决定是否上数据库查询.如果session的缓存中不存在,通常会产生1+N次SQL查询.
list example:
s1 = sessionFactory.openSession();
Query q = s1.createQuery("from com.test.hb.Hbtest h where h.id<2");
List l = q.list();
Iterator itr = l.iterator();
while(itr.hasNext()){
Hbtest tbo = (Hbtest)itr.next();
1条SQL:
select hbtest0_.ID as ID0_,hbtest0_.VAL as VAL0_ from HB.HBTEST hbtest0_ where hbtest0_.ID<2
iterate example:
s1 = sessionFactory.openSession();
Query q = s1.createQuery("from com.test.hb.Hbtest h where h.id<2");
Iterator itr = q.iterate();
while(itr.hasNext()){
Hbtest tbo = (Hbtest)itr.next();
3条SQL(1+2)
第一条SQL取得id
select hbtest0_.ID as col_0_0_ from HB.HBTEST hbtest0_ where hbtest0_.ID<2
两条根据id取记录的SQL(缓存中不存在于该id对应的记录)
select hbtest0_.ID as ID0_0_, hbtest0_.VAL as VAL0_0_ from HB.HBTEST hbtest0_ where hbtest0_.ID=?
使用场景:如果在cache中不存在对应的记录时,用list方法.如果大量的记录已经在cache中存在,用iterate性能更好.
query 的cache打开后对list和iterator方式的影响:
将query 的cache打开的话,缓存的是query本身,以hql 生成的 sql ,再加上参数,分页等信息做为key值, 而不是query的结果.query的结果是放在session的cache中,和query的cache是有区别的.
打开query的cache:1,在config中设置 hibernate.cache.use_query_cache = true,2,在创建query后query.setCacheable(true);
下面是打开query的cache后用list 的几个场景:
1:
Query q1 = s1.createQuery("from com.test.hb.Hbtest h where h.id<3");
q1.setCacheable(true);
Query q2 = s1.createQuery("from com.test.hb.Hbtest h where h.id=1");
q2.setCacheable(true);
从逻辑上将,第一个query查询出的值应该包含第二个query,但是第二个query不会用query的cache,而是会从新查询数据库.
2:
Query q1 = s1.createQuery("from com.test.hb.Hbtest h where h.id=1");
q1.setCacheable(true);
Query q2 = s1.createQuery("from com.test.hb.Hbtest h where h.id=1");
q2.setCacheable(true);
两个query一模一样,第二个query会用query的cache,不会从新查询数据库.
3:
Query q1 = s1.createQuery("from com.test.hb.Hbtest h where h.id=?").setInteger(0, 1);
q1.setCacheable(true);
Query q2 = s1.createQuery("from com.test.hb.Hbtest h where h.id=?").setInteger(0, 1);
q2.setCacheable(true);
两个query是一样的,第二个query会用query的cache,不会从新查询数据库.
4,
Query q1 = s1.createQuery("from com.test.hb.Hbtest h where h.id=?").setInteger(0, 1);
q1.setCacheable(true);
Query q2 = s1.createQuery("from com.test.hb.Hbtest h where h.id=?").setInteger(0, 2);
q2.setCacheable(true);
从逻辑上将,两个query是不一样的,第二个query不会用query的cache,而是会从新查询数据库.
query的cache打开后用iterator 的场景:
query的cache不会缓存第一次针对ID的SQL,后面iterator的时候,会根据session中的cache决定数据库的访问.可以说query的cache对
iterator方式没有影响.
**如果cache的是native SQL,两个query的sql 语句必须是一样的(包括大小写).如下面的例子会访问两次数据库.
Query q1 = s1.createSQLQuery("select val from Hbtest H where H.id=1");
Query q2 = s1.createSQLQuery("select val from Hbtest h where h.id=1");
而对于HQL则不会,HQL会被hibernate翻译成SQL,在这过程会'识别'出是不是相同的SQL.下面的例子只访问1次数据库.
Query q1 = s1.createQuery("from com.test.hb.Hbtest h1 where h1.id=1");
Query q2 = s1.createQuery("from com.test.hb.Hbtest h where h.id=1");
相关推荐
NULL 博文链接:https://364232252.iteye.com/blog/2369137
//该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...
3 list和iterate不同之处(//主要为了面试 详见hibernate_2900_Hibernate_list_iterate) 4 一级缓存和二级缓存和査询缓存(面试题)(详见hibernate_3000_Hibernate_3KindsOf_Cache) 5 事务并发处理(面试的意义...
ibatise中关于iterate的用法的例子
jsp脚本和<logic:iterate>标签:实现循环和分支逻辑 jsp脚本和<logic:iterate>标签:实现循环和分支逻辑 jsp脚本和<logic:iterate>标签:实现循环和分支逻辑
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...
我就是靠这个文档实现logic:iterate的循环的 struts 标签 logic:iterate使用 logic:iterate <br>第一页 是struts官方的说明, 第二页 是个例子 第三页 是我实现的arrayList放入标签的方法。 这是页面...
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
Map里存放的是List时 <br><logic:iterate id="destMap" name="srcMap"> <br> <logic:iterate id="bean" name="destMap" property="value" /> <br> <bean:write name="bean" property="name" /><br> ...
struts-logic iterate标签学习指南 这标签还不错
Iterate主要用来处理在页面上输出集合类,集合一般来说是下列之一: 1、 java对象的数组 2、 ArrayList、Vector、HashMap等
文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
logic:iterate 产生问题的图
5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 5.1.5 控制insert和update语句 5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例...
NULL 博文链接:https://duqiangcise.iteye.com/blog/286764
以随机顺序迭代列表中的值 npm install random-iterate 用法 var iterate = require ( 'random-iterate' ) var ite = iterate ( [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ) console . log ( ite ( ) ) // maybe 4 ...
This source demonstrate how to iterate the recent doc