Hibernate(十三):HQL查询(二)
背景
基于上一章节《Hibernate(十二):HQL查询(一)》,已经学习了一部分关于HQL的用法:
- HQL带参数查询
- HQL Order By排序查询
- HQL 设置实体参数查询
本章节将会学习:HQL分页查询、HQL命名语句查询、HQL投影查询、HQL报表查询。
HQL分页查询
1)setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认情况下,Query从查询结果中的第一个对象开始检索。
2)setMaxResults(int maxResults):设定一次最多检索出的对象的数目。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。
@Test
public void testHQLPageQuery() {
String hql = "From Employee"; int pageNum = 1;
int pageSize = 10;
Query query = session.createQuery(hql).setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize); List<Employee> employees = query.list();
System.out.println(employees.size());
System.out.println(employees);
}
执行sql及结果:
Hibernate:
select
employee0_.ID as ID1_1_,
employee0_.NAME as NAME2_1_,
employee0_.SALARY as SALARY3_1_,
employee0_.EMAIL as EMAIL4_1_,
employee0_.DEPARTMENT_ID as DEPARTME5_1_
from
DX_EMPLOYEE employee0_ limit ?
10
[Employee [id=1, name=tommy0, salary=0.0, email=tommy0@dx.com]
, Employee [id=2, name=tommy1, salary=1000.0, email=tommy1@dx.com]
, Employee [id=3, name=tommy2, salary=2000.0, email=tommy2@dx.com]
, Employee [id=4, name=tommy3, salary=3000.0, email=tommy3@dx.com]
, Employee [id=5, name=tommy4, salary=4000.0, email=tommy4@dx.com]
, Employee [id=6, name=tommy5, salary=5000.0, email=tommy5@dx.com]
, Employee [id=7, name=tommy6, salary=6000.0, email=tommy6@dx.com]
, Employee [id=8, name=tommy7, salary=7000.0, email=tommy7@dx.com]
, Employee [id=9, name=tommy8, salary=8000.0, email=tommy8@dx.com]
, Employee [id=10, name=tommy9, salary=9000.0, email=tommy9@dx.com]
]
HQL命名语句查询
在映射文件中定义命名查询语句:
1)Hibernate允许在映射文件中定义字符串形式的查询语句;
2)<query>元素用于定义一个HQL查询语句,它和<class>元素并列;
<query name="findNewsByContent">
<![CDATA[From News n Where n.content like :keyword]]>
</query>
3)在程序中,通过Session的getNamedQuery()方法获取查询语句对应的Query对象。
修改Employee.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-6-9 23:13:49 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.dx.hibernate09.hql01.Employee" table="DX_EMPLOYEE">
。。。
</class>
<query name="queryWithSalaryScope">
<![CDATA[From Employee e Where e.salary>:minSalary and e.salary<:maxSalary]]>
</query>
</hibernate-mapping>
测试函数
@Test
public void testHQLPageQuery() {
String hql = "From Employee"; int pageNum = 1;
int pageSize = 10;
Query query = session.createQuery(hql).setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize); List<Employee> employees = query.list();
System.out.println(employees.size());
System.out.println(employees);
}
执行sql及结果
Hibernate:
select
employee0_.ID as ID1_1_,
employee0_.NAME as NAME2_1_,
employee0_.SALARY as SALARY3_1_,
employee0_.EMAIL as EMAIL4_1_,
employee0_.DEPARTMENT_ID as DEPARTME5_1_
from
DX_EMPLOYEE employee0_
where
employee0_.SALARY>?
and employee0_.SALARY<?
4
[Employee [id=7, name=tommy6, salary=6000.0, email=tommy6@dx.com]
, Employee [id=8, name=tommy7, salary=7000.0, email=tommy7@dx.com]
, Employee [id=9, name=tommy8, salary=8000.0, email=tommy8@dx.com]
, Employee [id=10, name=tommy9, salary=9000.0, email=tommy9@dx.com]
]
HQL投影查询
1)投影查询:查询结果仅包含实体的部分属性。通过SELECT关键字实现。
2)Query的list()方法返回的结果集中包含的是数组类型的元素,每个对象数组代表查询结果的一条记录。
3)可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录,是程序代码能完成运用面向对象的语义来访问查询结果集。
4)可以通过DISTINCT关键字来保证查询结果不会返回重复元素。
返回数据测试:
@Test
public void testHQLFileds() {
String hql = "Select e.email,e.salary,e.department From Employee e Where e.salary>:salary and e.department=:department";
Department department = new Department();
department.setId(3);
Query query = session.createQuery(hql).setFloat("salary", 10000).setEntity("department", department); List<Object[]> result = query.list(); for (Object[] item : result) {
System.err.println(Arrays.asList(item));
}
}
执行sql语句及结果:
Hibernate:
select
employee0_.EMAIL as col_0_0_,
employee0_.SALARY as col_1_0_,
employee0_.DEPARTMENT_ID as col_2_0_,
department1_.ID as ID1_0_,
department1_.NAME as NAME2_0_
from
DX_EMPLOYEE employee0_
inner join
DX_DEPARTMENT department1_
on employee0_.DEPARTMENT_ID=department1_.ID
where
employee0_.SALARY>?
and employee0_.DEPARTMENT_ID=?
[tommy12@dx.com, 12000.0, Department [id=3, name=业务部门]]
[tommy17@dx.com, 17000.0, Department [id=3, name=业务部门]]
[tommy22@dx.com, 22000.0, Department [id=3, name=业务部门]]
[tommy27@dx.com, 27000.0, Department [id=3, name=业务部门]]
[tommy32@dx.com, 32000.0, Department [id=3, name=业务部门]]
[tommy37@dx.com, 37000.0, Department [id=3, name=业务部门]]
[tommy42@dx.com, 42000.0, Department [id=3, name=业务部门]]
[tommy47@dx.com, 47000.0, Department [id=3, name=业务部门]]
[tommy52@dx.com, 52000.0, Department [id=3, name=业务部门]]
[tommy57@dx.com, 57000.0, Department [id=3, name=业务部门]]
[tommy62@dx.com, 62000.0, Department [id=3, name=业务部门]]
[tommy67@dx.com, 67000.0, Department [id=3, name=业务部门]]
[tommy72@dx.com, 72000.0, Department [id=3, name=业务部门]]
[tommy77@dx.com, 77000.0, Department [id=3, name=业务部门]]
上边我们看到如果返回数据,用起来多少会有点不爽,是可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录,是程序代码能完成运用面向对象的语义来访问查询结果集。
修改上边的代码:
@Test
public void testHQLFileds_() {
String hql = "Select new Employee(e.email,e.salary,e.department) From Employee e Where e.salary>:salary and e.department=:department";
Department department = new Department();
department.setId(3);
Query query = session.createQuery(hql).setFloat("salary", 10000).setEntity("department", department); List<Employee> result = query.list(); for (Employee item : result) {
System.err.println(item.getId() + "," + item.getEmail() + "," + item.getSalary() + "," + item.getDepartment());
}
}
执行sql及结果:
Hibernate:
select
employee0_.EMAIL as col_0_0_,
employee0_.SALARY as col_1_0_,
employee0_.DEPARTMENT_ID as col_2_0_
from
DX_EMPLOYEE employee0_
inner join
DX_DEPARTMENT department1_
on employee0_.DEPARTMENT_ID=department1_.ID
where
employee0_.SALARY>?
and employee0_.DEPARTMENT_ID=?
Hibernate:
select
department0_.ID as ID1_0_0_,
department0_.NAME as NAME2_0_0_
from
DX_DEPARTMENT department0_
where
department0_.ID=?
null,tommy12@dx.com,12000.0,Department [id=3, name=业务部门]
null,tommy17@dx.com,17000.0,Department [id=3, name=业务部门]
null,tommy22@dx.com,22000.0,Department [id=3, name=业务部门]
null,tommy27@dx.com,27000.0,Department [id=3, name=业务部门]
null,tommy32@dx.com,32000.0,Department [id=3, name=业务部门]
null,tommy37@dx.com,37000.0,Department [id=3, name=业务部门]
null,tommy42@dx.com,42000.0,Department [id=3, name=业务部门]
null,tommy47@dx.com,47000.0,Department [id=3, name=业务部门]
null,tommy52@dx.com,52000.0,Department [id=3, name=业务部门]
null,tommy57@dx.com,57000.0,Department [id=3, name=业务部门]
null,tommy62@dx.com,62000.0,Department [id=3, name=业务部门]
null,tommy67@dx.com,67000.0,Department [id=3, name=业务部门]
null,tommy72@dx.com,72000.0,Department [id=3, name=业务部门]
null,tommy77@dx.com,77000.0,Department [id=3, name=业务部门]
HQL报表查询
报表查询用于对数据分组和统计,与SQL一样,HQL利用GROUP BY关键字对数据分组,用HAVING关键字对分组数据设定约束条件。
在HQL查询语句中可以调用以下聚合函数:
- count()
- min()
- max()
- sum()
- avg()
测试代码
@Test
public void testGroupBy() {
String hql = "Select min(e.salary),max(e.salary) "
+ "From Employee e "
+ "group by e.department having(min(e.salary)>:minSalary)";
Query query = session.createQuery(hql).setFloat("minSalary", 0); List<Object[]> result = query.list();
for (Object[] item : result) {
System.out.println(Arrays.asList(item));
}
}
执行sql与结果
Hibernate:
select
min(employee0_.SALARY) as col_0_0_,
max(employee0_.SALARY) as col_1_0_
from
DX_EMPLOYEE employee0_
group by
employee0_.DEPARTMENT_ID
having
min(employee0_.SALARY)>?
[1000.0, 76000.0]
[2000.0, 77000.0]
[3000.0, 78000.0]
[4000.0, 79000.0]
Hibernate(十三):HQL查询(二)的更多相关文章
- Hibernate(十)HQL查询二
一.数据库的emp名和dept表 建立持久化类和配置文件,可以用MyEclipse直接生成 持久化类 package entity; import java.util.Date; public cla ...
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate五 HQL查询
HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- Hibernate 的hql查询简介【申明:来源于网络】
Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...
- Hibernate(十三)命名查询-批量处理和调用存储过程
一.命名查询 HQL语句混杂在代码之间将破坏代码的可读性 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式称为命名查询 二.建立数据表和持久化类 建立数据表 create ...
- Hibernate(九)HQL查询
一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...
- Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询
在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...
- hibernate的hql查询语句总结
这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...
- Hibernate 、Hql查询和Criteria查询
HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...
随机推荐
- Java基础知识回顾之二 ----- 修饰符和String
前言 在上一篇中,回顾了Java的基本数据类型 ,这篇就来回顾下Java中的一些修饰符以及String. 修饰符介绍 Java修饰符主要分为两类: 访问修饰符 非访问修饰符 其中访问修饰符主要包括 p ...
- spring boot高性能实现二维码扫码登录(中)——Redis版
前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...
- python处理点云数据并生成三维点云模型
1.python代码: 1 import numpy as np 2 import matplotlib.pyplot as plt 3 from mpl_toolkits.mplot3d impor ...
- [poj2185]Milking Grid_KMP
Milking Grid poj-2185 题目大意:给出一个字符矩阵,求最小覆盖矩阵(可以残余). 注释:$1\le R\le 10^5$,$1\le C \le 75$ 想法:和bzoj1355不 ...
- oracle、导出、导入
一.数据库导入: No1.查询所有表中那些是空表. select table_name from user_tables where NUM_ROWS=0; No2.拼接字符串生成SQL执行语句. s ...
- C#,一份超简单的数据库帮助类,SqlHelp
简单,实用,留存. using System; using System.Collections.Generic; using System.Configuration; using System.D ...
- Linux下的进程与线程(二)—— 信号
Linux进程之间的通信: 本文主要讨论信号问题. 在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程. 然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得 ...
- Django+xadmin打造在线教育平台(十)
十四.xadmin的进阶开发 14.1.权限管理 (1)用户权限 超级用户拥有所有权限,其它添加的用户默认没有任何权限 进后台添加一个用户“Editor1”,勾上“职员状态”后,这个用户才可以登录进后 ...
- alpha冲刺第三天
一.合照 二.项目燃尽图 三.项目进展 今天是一个瓶颈期,在昨天被困住的地方今天还是没能解决,所以今天的项目进展并没有发生什么变化. 今天晚上xl和lj去实验室找学姐了,在学姐的帮助下大概有了一点思路 ...
- C语言第四次作业--嵌套循环
一.PTA实验作业 题目1:打印九九口诀表 1.本题PTA提交列表 2.设计思路 (1)定义三个整形变量n,j,i,n表示任意给定的正整数. (2)输入一个正整数n. (3)令i=1,i<=n, ...