在HQL中,关键字不区分大小写,但属性名和类名区分大小写。
1.简单属性查询
(1)单一属性查询:返回的结果集为属性列表,其类型与实体中该属性的类型一致
List students=session.createQuery("select name from Student").list();
返回结果集List中是name集合,其类型与实体类Student中name的类型保持一致。
(2)多个属性查询:返回的结果集为对象数组,数组元素的类型与对应实体中的属性类型一致,其长度取决于select中属性的个数。
List students=session.createQuery("select id,name from Student").list();
这样遍历得到的是对象数组Object【】,其第一个元素为id,即下标值为0,第二个元素为name,下标值为1.
如何得到Student类型呢,采用HQL动态实例化Student对象,
首先为Student提供无参的构造函数,和一个带有id和name参数的构造函数,从而有
List students=session.createQuery("select new Student(id,name) from Student").list();
这样遍历得到的是Student对象。
(3)可以使用别名
List students=session.createQuery("select s.id,s.name from Student 【as】 s").list();
2.实体对象查询
(1)不使用select
List students=session.createQuery(" from Student").list();
返回的结果为实体对象集合
(2)不使用select,用别名
List students=session.createQuery(" from Student 【as】 s").list();
返回的也是实体对象集合
(3)使用select,必须用别名
List students=session.createQuery(" select s from Student 【as】 s").list();
返回的也是实体对象集合
但是使用select * from Student 是不支持的。
(4)使用Iterator接口
Iterator iter=session.createQuery(" from Student").iterate();
注意 iterate和list的区别:
A:使用iterate查询,在默认情况下利用缓存数据,若缓存中不存在相应记录,会出现N+1问题。
所谓“1”:即首先发出一条查询对象id列表的sql语句;
所谓”N“:根据id到缓存中查询,若缓存中没有与之匹配的记录,则根据id发出相应的sql查询语句。
B:list每次都会发出sql查询语句,会向缓存中放入数据,但默认情况下不利用缓存中的数据。