Hibernate第十篇【Hibernate查询详解、分页查询】
前言
在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式….到目前为止,我们都是使用一些简单的主键查询阿…使用HQL查询所有的数据….本博文主要讲解Hibernate的查询操作…
get/load主键查询
由于主键查询这个方法用得比较多,于是Hibernate专门为我们封装了起来…
- get()立即查询
- load()懒加载
对象导航查询
如果对象与对象之前存在一对多、多对一的关系的时候
- 在以前SQL查询的时候:我们如果想要得到当前对象与另一对象的关联关系的时候,就必须用多表查询来得到数据
- Hibernate提供了对象导航查询:我们可以使用主键查询完之后,得到的对象,直接使用对象得到集合…就可以得到对应的数据了。
// 对象导航查询
Dept dept = (Dept) session.get(Dept.class, 12);
System.out.println(dept.getDeptName());
//这里就可以得到部门对应的所有员工
System.out.println(dept.getEmps());
HQL查询
在Hibernate的第二篇已经讲解过了基本的概念了。在这里我们就直接看看怎么使用了。
值得注意的是:
- 在hbm.xml文件中的auto-import=”true” 要设置true。当然了,默认值就是ture
- 如果是false,写hql的时候,要指定类的全名
查询全部列
//方式一:直接写对象
Query q = session.createQuery("from Dept");
//方式二:可以为对象取别名
Query q = session.createQuery("select d from Dept d");
值得注意的是:HQL不支持*号,下面的代码是错误的。
//不能用*
Query q = session.createQuery("select d from Dept d");
查询指定的列
值得注意的是:使用HQL查询指定的列,返回的是对象数组Object[]
//只查询name和eatBanana列
Query query = session.createQuery("select m.name,m.eatBanana from Monkey m");
System.out.println(query.list());
封装对象
前面测试了查询指定的列的时候,返回的是对象数组…可是对象数组我们不好操作啊…Hibernate还提供了将对象数组封装成对象的功能
- JavaBean要有对应的构造函数
Query query = session.createQuery("select new Monkey(m.name,m.eatBanana )from Monkey m");
条件查询
在SQL中条件查询我们也用得比较多,我们来看看HQL中的条件查询有什么新特性。
占位符
占位符就是指?号,我们在SQL中也常常用…
Query query = session.createQuery("from Monkey m where m.name=?");
//HQL是从0开始的
query.setParameter(0, "大猴子");
System.out.println(query.list());
命名参数
HQL还支持命名参数查询!下面我们来看一下怎么用:
语法::命名
Query query = session.createQuery("from Monkey m where m.name=:monkeyName");
//HQL是从0开始的
query.setParameter("monkeyName", "大猴子");
System.out.println(query.list());
范围查询
范围查询就是使用between and关键字来查询特定范围的数据。。和SQL是一样的…
Query q = session.createQuery("from Dept d where deptId between ? and ?");
q.setParameter(0, 1);
q.setParameter(1, 20);
System.out.println(q.list());
模糊查询
模糊查询就是使用Like关键字进行查询,和SQL也是一样的。
- %号要写在参数上,不能写带SQL上!
//模糊
Query q = session.createQuery("from Dept d where deptName like ?");
q.setString(0, "%部%");
System.out.println(q.list());
聚合函数统计
我们也经常会查询数据库中一共有多少条记录这样的需求。那么在HQL中怎么用呢?
- HQL提供了uniqueResult()这么一个方法,返回只有一条记录的数据
Query query = session.createQuery("select COUNT(*) from Monkey");
Object o = query.uniqueResult();
System.out.println(o);
分组查询
分组查询和SQL是一样的…
//-- 统计t_employee表中,每个部门的人数
//数据库写法:SELECT dept_id,COUNT(*) FROM t_employee GROUP BY dept_id;
// HQL写法
Query q = session.createQuery("select e.dept, count(*) from Employee e group by e.dept");
System.out.println(q.list());
连接查询
连接查询也就是多表查询…多表查询有三种
- 内连接【等值连接】
- 左外连接
- 有外链接
值得注意的是:连接查询返回的也是对象数组!
//1) 内连接 【映射已经配置好了关系,关联的时候,直接写对象的属性即可】
Query q = session.createQuery("from Dept d inner join d.emps");
//2) 左外连接
Query q = session.createQuery("from Dept d left join d.emps");
//3) 右外连接
Query q = session.createQuery("from Employee e right join e.dept");
q.list();
迫切连接
由于连接查询返回的是对象数组,我们使用对象数组来操作的话会很不方便…既然是连接查询,那么对象与对象是肯定有关联关系的…于是乎,我们想把左表的数据填充到右表中,或者将右表的数据填充到左表中…使在返回的时候是一个对象、而不是对象数组!**HQL提供了**fetch关键字供我们做迫切连接~
//1) 迫切内连接 【使用fetch, 会把右表的数据,填充到左表对象中!】
Query q = session.createQuery("from Dept d inner join fetch d.emps");
q.list();
//2) 迫切左外连接
Query q = session.createQuery("from Dept d left join fetch d.emps");
q.list();
查询语句放在配置文件中【命名查询】
我们可以在具体的映射配置文件中存放一些常用的语句。以Dept为例
<!-- 存放sql语句,如果有<>这样的字符数据,需要使用CDATA转义! -->
<query name="getAllDept">
<![CDATA[
from Dept d where deptId < ?
]]>
</query>
在程序中,我们可以获取配置文件配置的语句
Query q = session.getNamedQuery("getAllDept");
q.setParameter(0, 10);
System.out.println(q.list());
Criteria 查询
Criteria是一种完全面向对象的查询…
Criteria使用的是add()来添加条件。条件又使用一个Restrictions类来封装
Criteria criteria = session.createCriteria(Monkey.class);
criteria.add(Restrictions.eq())
我们来简单看一下Restrictions的方法:
都是一些大于、小于、等于之类的….Criteria查询就使用不了分组、连接查询了。
SQLQuery本地SQL查询
有的时候,我们可能表的结构十分复杂,如果使用关联映射的话,配置文件是十分臃肿的…因此,我们并不是把全部的数据表都使用映射的方式来创建数据表…
这时,我们就需要用到SQLQuery来维护我们的数据了..
SQLQuery是不能跨数据库的,因为Hibernate在配置的时候就指定了数据库的“方言”…
SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM monkey_ limit 0,3");
System.out.println(sqlQuery.list());
返回的也是对象数组:
Hibernate也支持在SQLQuery中对数据进行对象封装..只要添加类型就行了
SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM monkey_ limit 0,3").addEntity(Monkey.class);
System.out.println(sqlQuery.list());
分页查询
传统的SQL我们在DAO层中往往都是使用两个步骤来实现分页查询
- 得到数据库表中的总记录数
- 查询起始位置到末尾位数的数据
Hibernate对分页查询也有很好地支持,我们来一下:
Query query = session.createQuery("from Monkey");
//得到滚动结果集
ScrollableResults scroll = query.scroll();
//滚动到最后一行
scroll.last();
int i = scroll.getRowNumber() + 1;
System.out.println("总计路数:" + i);
//设置分页位置
query.setFirstResult(0);
query.setMaxResults(3);
System.out.println(query.list());
- 提供了方法让我们设置起始位置和结束位置
- 提供了ScrollableResults来得到滚动结果集,最终得到总记录数
值得注意的是,滚动结果集是从0开始的,因此需要+1才可得到总记录数!
如果我们们使用的是SELECT COUNT(*) FROM 实体
,我们可以通过uniqueResult()方法获取数据的唯一记录,得到的数据转换成Long类型即可。
Long totalRecord = (Long) queryCount.uniqueResult();
Hibernate第十篇【Hibernate查询详解、分页查询】的更多相关文章
- SpringBoot第十篇:thymeleaf详解
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10931435.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 Sprin ...
- 分享知识-快乐自己:Hibernate 中Criteria Query查询详解
1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制
目录 1. Hibernate的查询方式 1.1 方式一:OID查询 1.2 方式二:对象导航查询 1.3 方式三:HQL方式 1.4 方式四:QBC查询 1.5 方式五:SQL查询 2. 环境搭建 ...
- hibernate集合映射inverse和cascade详解
hibernate集合映射inverse和cascade详解 1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
- Mysql高手系列 - 第12篇:子查询详解
这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...
- ThinkPHP视图查询详解
ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm 这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下 ThinkP ...
- mysql基础篇 - SELECT 语句详解
基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...
- (转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- MySQL慢查询(二) - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析
随笔 - 66 文章 - 0 评论 - 19 MySQL慢查询(二) - pt-query-digest详解慢查询日志 一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它 ...
随机推荐
- asp.net core 运用 Redis 配置步骤
Redis可以用来存储session或直接存储键值对 首先要有asp.net core的项目,可以是webapi 或者MVC项目,还有有本地的Redis或者在远程服务器上,具体的安装就不讲述了 以下是 ...
- APP应用测试技巧
分页数据 测试分页数据,必须要满足一页数据,根据APP设置的分页数据准备一些测试数据. 满足一页数据的时候上下滑动瀑布流时, 页面数据是否会正常展示: 是否会出现第二页请求不到数据: 是否会出现重复加 ...
- mysql 存储过程中使用游标中使用临时表可以替代数组效果
mysql不支持数组.但有时候需要组合几张表的数据,在存储过程中,经过比较复杂的运算获取结果直接输出给调用方,比如符合条件的几张表的某些字段的组合计算,mysql临时表可以解决这个问题.临时表:只有在 ...
- 一点点刚学不久的JS
1 js中的变量和输入输出 {使用js的三种方式} 1 在html标签中直接内嵌js(并不提倡使用): <button onclick="alert('小婊砸你真点啊!')&quo ...
- 【VMware Workstation】NAT映射虚拟机所在网络
配置虚拟网络编辑器 配置网络映射关系
- javaScript 设计模式系列之三:代理模式
介绍 代理模式为其他对象提供一种代理以控制对这个对象的访问. 根据代理模式的使用目的不同,代理模式又可以分为多种类型: 远程代理(Remote Proxy) 虚拟代理(Virtual Proxy)如需 ...
- Java虚拟机说明书
JVM运行原理: Class的加载 过程:加载-验证-准备-解析-初始化-执行-卸载 加载:class文件(二进制字节流)被类加载器加载到内存中,将这个字节流所代表的静态存储结构转化为方法区的运行时数 ...
- 关于RequestDispatcher的原理
RequestDispatcher简介 RequestDispatcher 代表请求的派发者.它有2个动作:forward 和 include .客户端对于任何一个请求,可以根据业务逻辑需要,选择不同 ...
- JavaWeb程序连接SQLserver数据库
声明:一直以来都以为javaweb程序连接数据库是一个很高大上很难的问题,结果今天学习了一下,不到两个小时就解决了,所以总结一篇博客. JavaWeb程序连接SQLserver数据库分为一下步骤: 1 ...
- 如何将ASP.NET-WebApi发布到IIS6.0上(转)
关于"如何将ASP.NET-WebApi发布到IIS6.0上"的这方面的学习,一开始项目组长让我们接触的时候,我的心情是这样的 哇呜.jpg 当时真的是一脸懵逼啊,对于刚接触asp ...