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 ...
随机推荐
- 什么是 BPMN ?为什么我们要用 BPMN 和工作流 ?
BPMN 和 Activiti 介绍 工作流介绍 在任何行业和企业中,都有各种各样的流程,例如: 请假流程 报销流程 入职流程 离职流程 出差流程 等等-- 就算你自己没有设计过工作流,那么你每天肯定 ...
- P3643 [APIO2016]划艇
P3643 [APIO2016]划艇 题意 一个合法序列可表示为一个长度为 \(n\) 的序列,其中第 \(i\) 个数可以为 0 或 \([l_i,r_i]\) 中一个整数,且满足所有不为零的数组成 ...
- odoo视图 “动作” 里添加菜单按钮:案例
####################################################################################odoo中常用方法,在动作里面添 ...
- 大数据学习(03)——HDFS的高可用
高可用架构图 先上一张搜索来的图. 如上图,HDFS的高可用其实就是NameNode的高可用. 上一篇里,SecondaryNameNode是NameNode单节点部署才会有的角色,它只帮助NameN ...
- Synology群晖100TB万兆文件云服务器NAS存储池类别 RAID 6 (有数据保护)2021年7月29日 - Copy
Synology群晖100TB万兆文件云服务器NAS存储池类别 RAID 6 (有数据保护)2021年7月29日 - Copy https://www.autoahk.com/archives/367 ...
- 异地远程访问群晖NAS中的文件
异地远程访问群晖NAS中的文件 我以群晖DS720+网络存储服务器为例,介绍我是如何异地远程访问群晖NAS中的文件的. 此文章只介绍部署操作的大概步骤,具体的操作方法和技巧可以在西瓜视频.抖音 ...
- [.NET大牛之路 006] 了解 Roslyn 编译器
.NET大牛之路 • 王亮@精致码农 • 2021.07.09 维基百科对编译器的解释是:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言).编译是从源代码(通 ...
- 「GM_脚本」获取 GitHub 项目文件的 jsDelivr CDN 地址「好像没啥用系列」
基本信息: name:「 GitHub 」获取文件的 jsDelivr 地址 desc:获取项目文件的 CDN 地址 url: https://github.com/wdssmq/userscript ...
- IPSec组播概要
IPSec作为主流IP安全协议之一,在单播环境下,特别是在VPN场景中应用广泛.但是在组播环境貌似看到的不多,通过RFC4301了解到IPSec首先是支持组播的,即通过手动配置的方式可以实现组播包加密 ...
- Markdown 学习(语法)
标题 井号加空格(# ) 几个#就是几级标题 字体 粗体 (两边两个*) 斜体 (两边一个*) 斜体加粗 (两边三个*) 中间斜线 (两个波浪号~) 引用 选择引用,一个箭头 > 加空格 分割线 ...