Hibernate之检索方式
时间:2017-1-22 16:09
——检索方式
Hibernate中提供了以下几种检索对象的方式:
* 导航对象图检索方式
根据已经加载额对象导航到其他对象。
> Customer customer = (Customer)session.get(Customer.class, 1)
customer.getOrders(); // 得到客户的订单
* OID检索方式
按照对象的OID来检索对象。
> get() / load()
* HQL检索方式
使用面向对象的HQL查询语言。
> Query query = session.createQuery(String HQL)
* QBC检索方式
使用QBC API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口。
> Criteria criteria = session.createCriteria(Customer.class)
* 本地SQL检索方式
使用本地数据库的SQL查询语句。
> SQLQuery quer = session.createSQLQuery(String sql)
——HQL
1、HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相似,在Hibernate提供的各种检索方式中,HQL是使用最广泛的一种检索方式,它有如下功能:
* 在查询语句中设定各种查询条件
* 支持投影查询,即仅检索出对象的部分属性
* 支持分页查询
* 支持连接(多表)查询
* 支持分组查询,允许使用HAVING和GROUP BY关键字
* 提供内置函数,如SUM(),MIN(),MAX()
* 能够调用用户自定义的SQL函数或标准的SQL函数
* 支持子查询
* 支持动态绑定参数
2、HQL检索方式包括以下步骤
* 通过Session的createQuery()方法创建一个Query对象,它包括一个HQL查询语句,HQL查询语句中可以包含命名参数。
* 动态绑定参数
* 调用Query的list()方法执行查询语句,该方法返回java.util.List类型的查询结果,在List集合中存放了复合查询条件的持久化对象。
3、Query接口支持方法调用链编程风格,它的setXxx()方法返回自身实例,而不是void类型
4、HQL和SQL的区别
1)HQL查询语句是面向对象的,Hibernate负责解析HQL查询语句,然后根据对象 - 关系映射文件中的映射信息,把HQL查询语句翻译成相应的SQL语句,HQL查询语句中的主体是域模型中的类及类的属性。
2)SQL查询语句是与关系型数据库绑定在一起的,SQL查询语句中的主体是数据库表及表的字段。
示例代码:
1)使用HQL查询所有数据
// 使用HQL查询全部客户信息
2)使用别名进行查询
// 使用别名查询
3)多态查询
会将配置文件中实现了指定类的全部子类都进行查询。
Query query = session.createQuery("from java.lang.Object");
4)对查询结果进行排序
List<Customer> list = session.createQuery("from Customer as c order by c.id desc").list();
5)分页查询
// 使用HQL进行分页查询
6)查询单个记录
// 使用HQL查询单个记录
7)投影查询
/*
* public Customer(Integer cid, String cname){ ... }
// 使用?方式绑定参数
// 多个参数
print(list);
print(list);
print(list);
9)模糊查询
print(list);
10)聚合函数
print(list);
——QBC
QBC运算符:
示例代码:
1)使用QBC查询所有数据
// 使用QBC的方式查询所有客户信息
2)对查询结果进行排序
3)分页查询
print(list);
4)查询单个记录
System.out.println(customer);
5)条件查询
// 绑定一个参数
// 绑定多个参数
criteria.add(Restrictions.eq("cid", "2"));
6)模糊查询
// 使用QBC进行模糊查询
——SQL
示例代码:
1)使用SQL查询所有数据
// 使用SQL查询全部客户信息,并将结果记录封装到实体对象中
——多表查询
1、普通多表查询
1)交叉连接
select * from A,B;
得到的是笛卡尔积。
2)内连接
查询的是两个表的交集
select * from A inner join B on A.字段 = B.字段;
隐式内连接:
select * from A, B where A.字段 = B.字段
3)外连接
左外连接
select * from A left outer join B on A.字段 = B.字段
右外连接
select * from A right outer join B on A.字段 = B.字段
2、在HQL中的多表查询
1)交叉连接
2)内连接
3)隐式内连接
4)迫切内连接
5)左外连接
6)迫切左外连接
7)右外连接
3、示例代码
1)内连接
/*
2)迫切内连接
// 迫切内连接,使用一个关键字fetch
4、左外连接与迫切左外连接的用法与内连接、迫切内连接相同
5、HQL的内连接与迫切内连接的区别:
内连接查询:
将数据封装到List<Object[]>中。
迫切内连接:
将数据封装到一个List<Customer>中,但是迫切内连接会得到重复的记录,需要使用distinct去重。
——离线条件查询
现在有这么一个表单,可以根据不同的查询条件进行不同的查询操作,但是DAO层无法获取Web层的对象,可以使用离线对象进行操作。
传统方式:
UserService user = new UserService();
user.findByCondition(username, sex, edu, tel);
这样做的局限性在于无法修改上传的内容,不方便扩展。
离线方式:
获得一个离线的Criteria,在Web层将Criteria对象的条件设置好。
criteria.add(Restrictions.eq("name", "张三"));
criteria.add(Restrictions.eq("sex", "男"));
然后在Web层调用service方法传入Criteria对象,在DAO层获取可执行的离线Criteria对象。
示例代码:
——总结
1、对象导航方式
* 可以通过一个对象获得到关联对象。
2、根据OID进行检索
* get()
* load();
3、HQL
* session.createQuery(String hql);
* 简单查询:from Customer
* 排序:from Customer c order by c.cid desc;
* 条件查询:位置绑定参数(?),名称绑定参数(:name)
* 分页查询:query.setFirstResult(int from); query.setMaxResult(int max)
* 聚合函数:select count(*) from Customer group by cid;
* 多态查询:from java.lang.Object
* 投影查询:select cid, cname from Customer
* 构造方法将查询结果封装成对象:select new Customer(cid, cname) from Customer
* 多表查询
> 交叉连接
> 内连接
> 迫切内连接
> 左外连接
> 迫切左外连接
* 命名查询
4、QBC
* session.createCriteria(Class class);
* 简单查询
* 排序查询
* 条件查询:criteria.add(Restrictions(name, value));
* 分页查询
* 离线条件查询
5、SQL
* session.createSQLQuery(String sql);
Hibernate之检索方式的更多相关文章
- Hibernate的检索方式
Hibernate的检索方式 检索方式(查询的方式) 导航对象图检索方式: 根据已经加载的对象导航到其他对象 Customer customer = (Customer)session.get(Cus ...
- 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)
本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...
- 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)
Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...
- Hibernate的检索方式--查询数据的方式
Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID ...
- 【Hibernate】检索方式
一.概述 二.HQL 2.1 简介 2.2 查询所有记录 2.3 查询使用别名 2.4 排序 2.5 分页查询 2.6 单个对象查询 2.7 参数绑定 2.8 投影操作 2.9 模糊查询 2.10 S ...
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate检索方式 分类: SSH框架 2015-07-10 22:10 4人阅读 评论(0) 收藏
我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位.那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为Hi ...
- Hibernate检索方式(转载)
我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位. 那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为H ...
随机推荐
- POJ3190 - 优先队列 贪心
POJ3190 将所有牛从小到大排序然后用优先队列(小根堆)依次记录插入的牛的结束时间,如果插入牛时起始时间大于首元素,ans不增加并弹出首元素. 挺简单的.那么为什么我会写(水)这篇博客呢? #in ...
- informix常用函数
一.常用函数 1.decimal decimal(14,2):14位数,小数占两位:decimal(26,8),有效长度为26,小数位占8位. 2.cast cast:Oracle中的数据类型转换函数 ...
- (JAVA2)写博客的好帮手:Typora
(二)写博客的好帮手:Typora 推荐文本编辑器 :Typora 文件后缀 : xxx.md 安装步骤 打开浏览器搜索Typora 进入官网后,点击Download(下载) 选择自己的操作系统 选择 ...
- maven 工程构建 之_____<dependencyManagement>标签
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Redis.conf分析
Redis.conf 单位 配置文件对大小写不敏感 # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1m ...
- 大数据学习(26)—— Spark之RDD
做大数据一定要有一个概念,需要处理的数据量非常大,少则几十T,多则上百P,全部放内存是不可能的,会OOM,必须要用迭代器一条一条处理. RDD叫做弹性分布式数据集,是早期Spark最核心的概念,是一种 ...
- Windows 系统安装 git基础小白的简单操作包含基本输入命令
首先 去官网下载git应用 https://git-scm.com/downloads 点击前往 安装的操作也比较简单,一直点击下一步 安装完成之后 在空白桌面点击是否有 Git Gui ...
- CircuitBreaker断路器Fallback如何获取异常
在Spring Cloud 2020新版里, 可以使用新版的 CircuitBreaker 断路器, 可以配置Fallback, 可以是内部的, 也可以是外部的Fallback. 内部 Fallbac ...
- Devcpp(Dev-C++)代码编辑的快捷键
转自:https://blog.csdn.net/u010940020/article/details/43735549 这里记录一些个人使用Devcpp时,摸索出来的代码编辑快捷键,感觉非常有用.如 ...
- 数据结构与算法-排序(七)希尔排序(Shell Sort)
摘要 看希尔排序需要先想象出一个二维的矩阵,在这个矩阵中,有多少列数据全看步长(一定的规则得到).处理完之后,就再接着用另一个步长组成矩阵处理.直到步长全部使用完. 这里的巧妙之处就是没有把序列先处理 ...