一.掌握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())

}