[原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
2016-10-06 23:16
866 查看
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Employee
package com.jason.hibernate.entities.HQL;
public class Employee{
private Integer id;
private String name;
private float salary;
private String email;
private Departmentdept;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public DepartmentgetDept() {
return dept;
}
public void setDept(Departmentdept) {
this.dept = dept;
}
@Override
public String toString() {
return "Employee[id=" + id + ", name=" + name + ", salary=" + salary
+ ", email=" + email + ", dept=" + dept + "]";
}
}
Department
package com.jason.hibernate.entities.HQL;
import java.util.HashSet;
import java.util.Set;
public class Department{
private Integer id;
private String name;
private Set<Employee> emps = new HashSet<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
}
Department.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 2016-10-6 19:46:22 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="com.jason.hibernate.entities.HQL"> <class name="Department" table="GG_DEPARTMENT"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true"> <key> <column name="DEPT_ID" /> </key> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
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 2016-10-6 19:46:22 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="com.jason.hibernate.entities.HQL"> <class name="Employee" table="GG_EMPLOYEE"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="salary" type="float"> <column name="SALARY" /> </property> <property name="email" type="java.lang.String"> <column name="EMAIL" /> </property> <many-to-one name="dept" class="Department" fetch="join"> <column name="DEPT_ID" /> </many-to-one> </class> </hibernate-mapping>
HibernateTest
package com.jason.hibernate.entities.HQL; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; public class HibernateTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; // 创建上述三个对象 @Before public void init() { Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); session = sessionFactory.openSession(); transaction = session.beginTransaction(); } // 关闭上述三个对象 @After public void destroy() { transaction.commit(); session.close(); sessionFactory.close(); } }
测试方法
1. 分页查询:
1)setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
2)setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
@Test
public void testPageQuery(){
String hql = "FROM Employee";
Query query = session.createQuery(hql);
int pageNo = 3;
int pageSize = 5;
List<Employee> emps =query.setFirstResult((pageNo - 1) * pageSize).setMaxResults(pageSize).list();
for(Employeeemp : emps){
System.out.println(emp);
}
}
2.命名查询语句
1)Hibernate 允许在映射文件中定义字符串形式的查询语句
2)<query> 元素用于定义一个 HQL 查询语句, 它和 <class> 元素并列.
3)在程序中通过 Session 的 getNamedQuery() 方法获取查询语句对应的 Query 对象.
在employee.hbm.xml 中添加如下命名
<!-- 命名查询 -->
<query name="salaryEmps"><![CDATA[FROM Employeee WHERE e.salary > :minSal AND e.salary < :maxSal]]> </query>
测试
@Test public void testNamedQuery(){ Query query = session.getNamedQuery("salaryEmps"); List<Employee> emps = query.setFloat("minSal", 5000).setFloat("maxSal", 10000).list(); System.out.println(emps.size()); }
3.投影查询
1)投影查询: 查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.
2)Query 的 list() 方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录
3)可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录, 使程序代码能完全运用面向对象的语义来访问查询结果集.
4)可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素
方式一:
@Test
public void testFieldQuery(){
String hql = "SELECT e.email, e.salary FROM Employeee WHERE e.dept = :dept";
Query query = session.createQuery(hql);
Departmentdept = new Department();
dept.setId(80);
List<Object[]> result = query.setEntity("dept", dept).list();
for(Object[] objs : result){
System.out.println(Arrays.asList(objs));
}
}
方式二:推荐
① 将返回的属性,在持久化类中封装返回属性的构造器,按照属性定义的顺序
② 结果返回给 一个list<entity> 的集合
③ 通过遍历集合,输出值
测试方法
@Test
public void testFieldQuery(){
String hql = "SELECT new Employee(e.email, e.salary, e.dept) FROM Employeee WHERE e.dept = :dept";
Query query = session.createQuery(hql);
Departmentdept = new Department();
dept.setId(80);
List<Employee> result = query.setEntity("dept", dept).list();
for(Employeeemp : result){
System.out.println(emp.getId() + "," + emp.getEmail() + "," + emp.getSalary() + "," + emp.getDept());
}
}
在Employee持久化类中增加一个特定的构造器
public Employee(String email, float salary, Departmentdept) {
super();
this.salary = salary;
this.email = email;
this.dept = dept;
}
4.报表查询:
1)报表查询用于对数据分组和统计, 与 SQL 一样, HQL 利用 GROUP BY 关键字对数据分组, 用 HAVING 关键字对分组数据设定约束条件.
2)在 HQL 查询语句中可以调用以下聚集函数:count() min() max() sum() avg()
@Test
public void testGroupBy(){
String hql = "SELECT min(e.salary) , max(e.salary)"
+ "FROM Employeee "
+ "GROUP BY e.dept "
+ "HAVING min(e.salary) > :minSal";
Query query = session.createQuery(hql).setFloat("minSal", 5000);
List<Object[]> result = query.list();
for(Object[] objs : result){
System.out.println(Arrays.asList(objs));
}
}
相关文章推荐
- [原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页
- [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
- [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解
- HQL 查询方式, 及分页查询:、 命名查询语句、 投影查询、报表查询
- [原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
- [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现
- [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现
- [原创]java WEB学习笔记83:Hibernate学习之路---双向 1-n介绍,关键点解释,代码实现,set属性介绍(inverse,cascade ,order-by )
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
- Hibernate(二)HQL&SQL参数绑定、投影和分页以及命名查询
- [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
- 【知识整理】Hibernate-HQL查询之分页查询、投影查询、报表查询
- hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
- [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
- [原创]java WEB学习笔记76:Hibernate学习之路---Hibernate介绍,hibernate 环境的搭建
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定