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 ...
随机推荐
- Pytest单元测试框架之FixTure内置临时文件tmpdir操作
1.前言:某些接口需要引用上个接口返回的值,作为下个接口的入参,但笔者又不想在本地维护及创建此文件,此时引出fixture内置函数中的临时文件存储tmpdir 2.首先下面的源码是使用flask框架写 ...
- Python + Requests 知识点回顾
http://www.downza.cn/soft/11145.html PS下载地址 http://www.bejson.com/jsonviewernew/ JSON的在线视图 import re ...
- ArcGis API JS 4.X本地化部署与地图的基础使用
准备工作 首先下载ArcGIS API for JavaScript4.x,这里下载的是4.19. 官方下载地址:https://developers.arcgis.com/downloads/ ar ...
- mysql - 按条件统计
在表中分别统计mt =0 和 mt>0 的个数 方法一:select count(if(mt=0,1,null)) as a,count(if(mt>0,1,null)) as b fro ...
- 3分钟搭建一个网站?腾讯云Serverless开发体验
作为一个开发者,应该都能理解一个网站从开发到上线,要经过很多繁琐的步骤. 编写代码,部署应用,部署数据库,申请域名,申请SSL证书,域名备案,到最终上线起码要几天时间. 作为一个不精通代码的业务玩家, ...
- SPRING.NET FRAMEWORK 3.0 GA啦
THE SPRING.NET FRAMEWORK http://www.springframework.net/ 1. INTRODUCTION Spring.NET contains: A full ...
- [ZJOI2010]基站选址,线段树优化DP
G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...
- C++ //运算符重载 +号
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 //1.成员函数重载 +号 6 cla ...
- 基于Gitea搭建属于自己的Git服务
作者:IT王小二 博客:https://itwxe.com 一.搭建环境和前提 搭建环境: 操作系统:CentOS7.6 Docker版本:docker-ce-18.09.9 Lsky Pro版本:1 ...
- 手工设置Eclipse文本编辑器的配色
Eclipse中不同的文件都有自己专门的编辑器配色设置,下面分别说明. 文本编辑器的背景色: Window->Preferences-> General->Editors->T ...