Hibernate查询
一.掌握Hibernate检索策略?
检索(查询)策略分为3类:
立即加载(lazy=“false”)—— 不管用户是否使用该数据始终执行查询。
延迟加载(lazy=“true”)—— 用户使用的时候,才执行查询;否则不查询。
注意:延迟加载必须在session关闭之前使用。
迫切左外连接(outer-join=“true”、fetch=“join”)—— 联合查询(推荐使用方式)。
总结:查询数据时,立即、延迟都会生成多条SQL语句;迫切左外连接会使用联合查询,只会生成一条SQL语句。
batch-size:表示进行批量检索数据。(将多条SQL语句合并成一条SQL(使用in关键字进行查询));(只有立即、延迟加载时有效)
二.掌握HQL查询?
HQL查询语句:Hibernate中支持的查询语句。
2.1 为什么需要使用HQL查询,而不是使用标准SQL进行查询?
Hibernate需要支持所有数据库的查询。
2.2 如何使用HQL进行查询?
使用Session中的Query对象,进行查询。
注意:HQL语句查询的是类、属性(而不是表名、列名);HQL中的关键字不区分大小写,但是类、属性严格区分大小写。
常见的HQL查询语句:
查询指定列:
方式一: select 属性名1,属性名2,..... from 类名; 特点:返回一个List,集合中存放Object的数组。
方式二: select new 类名(属性名1,属性名2,..... ) from 类名; 特点:返回一个List,集合中存放指定的对象(前提:必须具有对应的构造函数)。 |
关联关系查询: 示例:from Emp e where e.dept.dname like '%软%'
连接查询:显示关联(HQL中含有join关键字)、隐式关联(利用Xxx.hbm.xml配置(fetch=“join”、outer-join=“true”)、不使用join关键字,但是查询了另外一张表的数据)
|
高级特性:
分页查询:setFirstResult() 、 setMaxResult();
占位符:使用“?”号占位;(可以避免SQL的注入漏洞);占位从下标0开始(JDBC中是从1开始的)。
三.掌握本地SQL查询?
针对某一种数据库提供的查询操作,称为本地SQL。(影响:数据库通用性)
示例:
List<Object[]> list = session.createSQLQuery("select *,DATEADD(DD, 5, GETDATE()) as ctime from dept").list();
//获取集合中,存放数据的类型 for(Object[] obj : list){ for(Object o : obj){ System.out.print(o+"\t"); } System.out.println(); } |
四.了解面向对象查询(Criteria查询)?
一点SQL都不会的人群;查询SQL条件比较复杂的情况。
List<Emp> list = session.createCriteria(Emp.class) .add(Restrictions.eq("ename", "许褚")) .add(Restrictions.gt("eid", 10)) .setFirstResult(0) .setMaxResults(5) .list();
for(Emp e : list){ System.out.println(e.getEname()+":"+e.getDept().getDname()) } |