hibernate笔记

1、简单属性查询【重要】
 * 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
 * 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
   数组的长度取决与select中属性的个数
 * 如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
2、实体对象查询【重要】
 * N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
   所谓的N+1是在查询的时候发出了N+1条sql语句
   1: 首先发出一条查询对象id列表的sql
   N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
 * list和iterate的区别?
  * list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
  * iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
 
 
45.hibernate支持对象化的查询。hql是中立的查询语句,通过配置方言,生成本地的sql语言。
from User user where user.group.name='amdin';支持对象的导航查询模式。
hql关键字不区分大小写,但是类名和属性是区分大小写的。
46.对于单个属性的查询,list里面元素的类和相应的实体类属性的类型是一致的。
比如属性类型是String的,那么list。get(i)就是string。查询多个属性的话,list里面 的数据
就是Object[],即是对象数组。list的个数就是查询的记录总数。里面数组元素的长度是hql里面查
询的属性的个数。
select new Student(id,name) from Student 对象化查询,返回的list里面的元素就都是student
对象。这是要求student对象有对应的构造函数,这里是2个参数。
当然也是可以使用别名的。
select s.id,s.name from Student as s
47.可以单独查询实体 from Student ,返回的是对象数组的集合,所有的属性全部查出。
查询实体对象必须使用别名,对于as ,则可以使用或者不使用。
不能select * from 实体类名 ,必须配合函数,如count(*)才可以。
48.N+1问题,1是指发出一条查询id的语句,N是指根据查询出的id来查询对应的实体记录。
使用迭代查询可以使用一级缓存(Session级别的缓存),缓存没有数据才去数据库查询。
但是list查询只会将数据放入缓存,而不会使用缓存(除非配置了查询缓存,默认不会利用缓存)

迭代查询首先会发出查询id的sql,若是缓存没有数据,才根据id去数据库查询实体对象。
对于list,直接发送查询实体的语句,不会发出查询id的语句。
使用iterate查询,可能出现N+1问题,缓存有数据则不会。N+1是指发出了N+1条sql

猜你喜欢

转载自zengshaotao.iteye.com/blog/1724237
今日推荐