Hibernate开发之数据检索方式
一丶概述
Hibernate为我们提供了多种数据检索方式,而在项目中,实际上用得最多的操作也是检索数据。hibernate检索数据可以有5种方式。如以下:
(1)导航对象图检索方式: 根据已经加载的对象导航到其他对象
(2)OID 检索方式: 按照对象的 OID 来检索对象
(3)HQL 检索方式: 使用面向对象的 HQL 查询语言
(4)QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口
(5)本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
(3)HQL 检索方式: 使用面向对象的 HQL 查询语言
(4)QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口
(5)本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
二丶导航对象图检索方式
利用类之间的关联关系来完成导航操作。例如班级(Class)和学生(Student),我要查班级上的一个同学,则可以由班级对象导航到学生对象,代码如下:
Class class1=(Class)session.get(Class.class,1);
Student student=class1.getStudents();
.
三丶OID 检索方式
主要是指利用session的get或者load方法来完成操作,
上面第一行代码就是利用这种方式加载数据的。
四丶HQL 检索方式
在hibernate的检索方式中,这种方式最为常用。 它是一种面向对象的查询语言,与sql语言类似,它提供一下功能:
--在查询语句中设定各种查询条件
--支持投影查询, 即仅检索出对象的部分属性
--支持分页查询
--支持连接查询
--支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字
--提供内置聚集函数, 如 sum(), min() 和 max()
--支持子查询
--支持动态绑定参数
-- 能够调用用户定义的 SQL 函数或标准的 SQL 函数
--支持投影查询, 即仅检索出对象的部分属性
--支持分页查询
--支持连接查询
--支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字
--提供内置聚集函数, 如 sum(), min() 和 max()
--支持子查询
--支持动态绑定参数
-- 能够调用用户定义的 SQL 函数或标准的 SQL 函数
(一)关于大小写敏感问题
除了Java类与属性的名称外,查询语句对大小写并不敏感。 所以 SeLeCT 与 sELEct 以及 SELECT 是相同的,但是 Class并不等价于 并且 Class.Students也不等价于Class.students。
(二)创建HQL查询步骤
通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数
动态绑定参数
调用 Query 相关方法执行查询语句.
动态绑定参数
调用 Query 相关方法执行查询语句.
(三)分页查询
setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
代码示例如下:
@Test
public void testPageQuery(){
String hql = "FROM Student";
Query query = session.createQuery(hql);
int pageNo = 10;
int pageSize = 6;
List<Student> stus = query.setFirstResult((pageNo - 1) * pageSize)
.setMaxResults(pageSize).list();
System.out.println(stus);
}
(四)投影查询
投影查询: 查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.
Query 的 list() 方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录, 使程序代码能完全运用面向对象的语义来访问查询结果集.
可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素。
Query 的 list() 方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录, 使程序代码能完全运用面向对象的语义来访问查询结果集.
可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素。
代码示例如下:
@Test
public void testFieldQuery(){
String hql = "SELECT s.name, e.score, s.classes FROM Student s WHERE s.classes = :classes";
Query query = session.createQuery(hql);
Class classes=new Class();
classes.setId(1);
List<Object[]> result = query.setEntity("classes", classes)
.list();
for(Object [] objs: result){
System.out.println(Arrays.asList(objs));
}
}
(五)报表查询
报表查询用于对数据分组和统计, 与 SQL 一样, HQL 利用 GROUP BY 关键字对数据分组, 用 HAVING 关键字对分组数据设定约束条件.
在 HQL 查询语句中可以调用以下聚集函数
count()
min()
max()
sum()
avg()
在 HQL 查询语句中可以调用以下聚集函数
count()
min()
max()
sum()
avg()
代码示例如下:
}
@Test
public void testGroupBy(){
String hql = "SELECT min(s.score) "
+ "FROM Student s "
+ "GROUP BY s.classes "
+ "HAVING min(s.score) > :minScore";
Query query = session.createQuery(hql)
<span style="white-space:pre"> </span>.setFloat("minScore", 60);
List<Object []> result = query.list();
for(Object [] objs: result){
System.out.println(Arrays.asList(objs));
<span style="white-space:pre"> </span>}
}
五丶QBC 检索方式
QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口
代码示例如下:
@Test
public void testQBC(){
//1. 创建一个 Criteria 对象
Criteria criteria = session.createCriteria(Student.class);
//2. 添加查询条件: 在 QBC 中查询条件使用 Criterion 来表示
//Criterion 可以通过 Restrictions 的静态方法得到
criteria.add(Restrictions.eq("id", "1"));
criteria.add(Restrictions.gt("score", 60f));
//3. 执行查询
Student student = (Student) criteria.uniqueResult();
System.out.println(student);
<pre name="code" class="java"> @Test
public void testNativeSQL(){
String sql = "INSERT INTO Student VALUES(?, ?)";
SQLQuery query = session.createSQLQuery(sql);
query.setInteger(0, 1)
.setString(1, "lkx")
.executeUpdate();
}
}
六丶native SQL查询
你也可以使用你的数据库的Native SQL语言来查询数据。这对你在要使用数据库的某些特性的时候(比如说在查询提示或者Oracle中的 CONNECT关键字),这是非常有用的。这就能够扫清你把原来直接使用SQL/JDBC 的程序迁移到基于 Hibernate应用的道路上的障碍。
Hibernate3允许你使用手写的sql来完成所有的create,update,delete,和load操作(包括存储过程)
@Test
public void testNativeSQL(){
String sql = "INSERT INTO Student VALUES(?, ?)";
SQLQuery query = session.createSQLQuery(sql);
query.setInteger(0, 1)
<span style="white-space:pre"> </span>.setString(1, "lkx")
.executeUpdate();
}