一.Hibernate检索简介
Hibernate的检索方式主要有5种,分别是:
检索方式 | 特点 |
---|---|
对象图导航检索 | 根据已加载的对象,导航到其关联对象的检索方式,局限性比较大,不常用 |
OID检索 | 使用Session的get( )方法和load( )查询数据库记录,局限性比较大,不常用 |
HQL检索 | 全称Hibernate Query Launguage,Hibernate查询语言,是Hibernate专属的数据库查询语言,使用了面向对象的思想。 |
QBC检索 | 全称Query By Criteria,Hibernate的另一种对象检索方式,由Criteria接口,Criterion接口,和Expression类组织条件查询数据库。 |
SQL检索 | Hibernate也支持使用SQL语句查询数据库,即使用SQL检索 |
二.Hibernate中与检索相关的API
2.1 Query接口
一个Query实例代表一个Hibernate查询操作,Query接口是Hibernate用来执行HQL查询和SQL查询的接口
获取Query实例的方式:
通过Session实例创建Query实例
//创建HQL检索,createQuery方法的参数是一个HQL查询语句
Query query = session.createQuery(hql);
Query接口的常用方法:
方法 | 功能 |
---|---|
list( ) | 执行数据库查询并返回一个List集合(需要强转接收数据) |
uniqueUpdate( ) | 当返回值只有一条记录时可以使用该方法 |
setFirstResult( ) | 设置从第几条记录开始查询,默认从0开始,限制结果集范围,用于分页 |
setMaxResult( ) | 设置结果集的最大记录数,限制结果集范围,用于分页 |
exceteUpdate( ) | 支持HQL语句的更新和删除 |
setXXX( ) | 用于设置查询参数,不同的数据类型用到不同的set方法 |
iterator( ) | 用于查询,返回一个Iterator类型的结果集 |
2.2 SQLQuery接口
用于接收一个SQL语句,并通过执行list( )或uniqueResult( )方法执行查询,不常用
获取SQLQuery实例的方式:
通过Session实例创建SQLQuery实例
//创建SQL检索,createSQLQuery方法的参数是一个SQL查询语句
SQLQuery query = session.createSQLQuery(sql);
2.3 Criteria接口
是一个完全面向对象,可扩展的条件查询API,同Criterion接口的实例设置查询参数。使用Criteria时完全不需要考虑数据库底层实现及SQL细节。Criteria是实现QBC检索的核心接口
获取Criteria实例的方式:
通过Session实例创建Criteria实例
//创建QBC检索,createCriteria方法的参数是持久化类的class形式
Criteria criteria = session.createCriteria(TUser.class);
Criteria接口的常用方法:
方法 | 功能 |
---|---|
list( ) | 执行数据库查询并返回一个List集合(需要强转接收数据) |
uniqueUpdate( ) | 当返回值只有一条记录时可以使用该方法 |
setFirstResult( ) | 设置从第几条记录开始查询,默认从0开始,限制结果集范围,用于分页 |
setMaxResult( ) | 设置结果集的最大记录数,限制结果集范围,用于分页 |
add(Criterion criterion) | 添加查询条件的,参数是一个Criterion接口的实例 |
2.4 Criterion接口
查询条件接口,Hibernate将每一个查询条件使用一个Criterion接口的实例封装
2.5 Restrictions对象
和Criterion接口配合使用,用于给QBC查询设置查询条件,Restrictions对象中有很多静态方法,用来创建查询条件,常用的方法如下:
方法名 | 含义 |
---|---|
Restrictions.eq | 等于 |
Restrictions.allEq | 使用Map集合,用key/value比较多个值是否相等 |
Restrictions.gt | > |
Restrictions.ge | 大于等于>= |
Restrictions.lt | < |
Restrictions.le | 小于等于<= |
Restrictions.between | 对应SQL的between子句 |
Restrictions.like | 对应SQL的like子句 |
Restrictions.in | 对应SQL的in子句 |
Restrictions.and | and与关系 |
Restrictions.or | or或关系 |
Restrictions.sqlRestriction | SQL限定查询 |
2.6 DetachedCriteria接口
DetachedCriteria中文译作—-离线查询条件,Criteria接口的实例必须由Session创建,但是DetachedCriteria则不需要,可以在不经过Session创建的条件下使用,组织查询条件
三.HQL检索
HQL语句和SQL语句十分相似,但是HQL语句是面向对象的,它面向的不是数据库表和其中的字段,而是持久化类及其属性。HQL语句的组织还需要使用Query接口的实例来设置参数
3.1 没有参数的HQL语句
不需要设置参数的HQL语句的执行方式:
String hql = "HQL语句";
Query query = session.createQuery(hql);
List<TUser> list = query.list();
1)简单查询
//查询user表中的所有数据
select * from TUser
注:使用HQL查询语句查询数据库中的全部数据时常省略关键字select
from TUser
2)投影查询(即查询一列数据)
//查询user表中username字段的值
select username from TUser
3)排序查询
//查询user表中的所有数据并按照uid字段排序显示
from TUser by uid desc
4)统计查询
//查询user表中记录总数
select count(*) from TUser
由于统计查询的查询结果是一个数据,所以可以用不同的方法(uniqueResult( ))接收查询结果
String hql = "HQL统计查询语句";
Query query = session.createQuery(hql);
Long num = (Long)query.uniqueResult();
3.2 HQL语句进行带参数的查询
1)条件查询
//查询user表中username字段的值为aaa的数据
String hql = "from TUser where username = ?";
Query query = session.createQuery(hql);
query.setString(0,"aaa");
List<TUser> list = query.list();
2)分页查询
//查询user表,从第5条开始,一共查出7条数据
String hql = "from TUser";
Query query = session.createQuery(hql);
//设置查询起始点,第5条数据
query.setFirstResult(5);
//设置查询长度,共7条数据
query.setMaxResults(7);
List<TUser> list = query.list();
四.QBC检索
QBC中文译作—–Query By Criteria ,是Hibernate常用的条件检索方式,QBC检索主要由Criteria接口,Criterion接口和Expression类组成。
1)基本查询
查询user表中的所有数据,结果集封装进一个List集合中
//查询user表
Criteria criteria = session.createCriteria(TUser.class);
List<TUser> list = criteria.list();
2)条件查询
查询条件通过Restrictions类的方法进行设置
//查询user表
Criteria criteria = session.createCriteria(TUser.class);
//设置查询参数,查询username属性为mc1的数据
criteria.add(Restrictions.eq("username","mc1"));
List<TUser> list = criteria.list();
3)分页查询
分页查询的条件通过criteria的方法进行设置
//分页查询user表
Criteria criteria = session.createCriteria(TUser.class);
//设置起始点为5
criteria.setFirstResult(5);
//设置查询7条记录
criteria.setMaxResults(7);
List<TUser> list = criteria.list();
4)排序检索(按顺序显示结果)
//分页user表
Criteria criteria = session.createCriteria(TUser.class);
//设置结果集显示顺序
criteria.addOrder(Order.asc("uid"));
List<TUser> list = criteria.list();
5)离线检索
使用DetachedCriteria类,在未创建session时设置查询条件,实现离线查询,可以简化数据传递,比较常用
//创建离线查询对象DetachedCriteria,创建对象时需要指定对应的持久化类
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(TStuff.class);
//可以为DetachedCriteria类的对象设置查询条件(查询用户名为zhangsan的TStuff持久化类)
detachedCriteria.add(Restrictions.eq("username","zhangsan"));
//执行查询
List<TStuff> list = detachedCriteria.getExecutableCriteria(session).list();