Hibernate-03-Hibernate的检索方式

一.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.andand与关系
Restrictions.oror或关系
Restrictions.sqlRestrictionSQL限定查询

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值