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 ...
随机推荐
- UI作品评审总结:切忌过度设计,注意设计闭环
本期,我们一起看看学长认证模块--UI同学的作品评审. 拿好小板凳,做好笔记,我们开始吧! 我们拿了两个典型的作品进行了一个讲解,做的特色都还不错,但是都有些小问题. 先来看一下第一位 ...
- SQL注入:sqli-labs lesson-1 小白详解
为什么是小白详解?因为我就是小白 SQL注入早有耳闻,今天算是真正打开这个门了,但是想要跨进去应该还是没有那么容易. 在B站上听了40分钟的网课,老实说,他讲的还不错,第一遍听不懂也正常 https: ...
- odoo controllers 中type="Json" 或type="http"
服务端接收参考: # 导包 from odoo import http class HttpRequest(http.Controller): @http.route('/url', type='js ...
- Python - 对象赋值、浅拷贝、深拷贝的区别
前言 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 这里会讲三个概念:对象赋值.浅拷贝.深拷贝 名词解释 变量:存储对象的引用 对象:会被分配一块内存,存储实际的数据,比如 ...
- ifix中嵌入3d模型初探(一)
在ifix项目中插入3d模型,是当前工控上位机的一个发展趋势,故而我也来尝尝鲜.利用现有条件,初步打算完成一个工厂俯视3d全景. 基本思路:利用webbrowser+3dmax+three.js来嵌入 ...
- java类与对象基础篇
java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...
- 文件上传靶机DVWA和upload-labs
DVWA靶机 LOW <?php phpinfo() ?> 上传文件 Medium级别 修改Content-Type: application/octet-stream的值为jpg的格式为 ...
- JAVA数组的基础入门>从零开始学java系列
目录 JAVA数组的基础入门 什么是数组,什么情况下使用数组 数组的创建方式 获取数组的数据 数组的内存模型 为什么数组查询修改快,而增删慢? 查询快的原因 增删慢的原因 数组的两种遍历方式以及区别 ...
- linux之frp服务部署(内网穿透)
frp服务部署(内网穿透) 目的 更快的进行内网穿透调试以及云端开发测试 服务器为CentOS 7,客户端为win11 frp介绍 frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 ...
- 基于CAS实现SSO单点登录
1. 概述 1.1. 什么是SSO? 单点登录( Single Sign-On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要 登录一 ...