- 浏览: 254049 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
无它唯勤:
...
Spring Ioc AOP -
dubaopeng:
挺好的,拿去改改!
java 解析csv文件 -
灵程大哥:
先试一下,看行不行
java 判断文本文件编码 -
pxjianke:
谢谢兄弟。我现在在测试插入千万级数据。做测试。这个太有用了。
Oracle 高速批量速插入数据 解决方案
Hibernate检索对象的方式
教学内容
HQL检索方式
QBC检索方式
本地SQL检索方式
Hibernate提供的检索对象的方式
导航对象图检索方式
根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,Hibernate会从数据库中加载关联的Order对象,否则就从缓存中取得Order对象。
OID检索方式
按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。
HQL检索方式
使用面向对象的HQL查询语言。Session的find()方法用于执行HQL查询语句。此外,Hibernate还提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。本章有时把HQL检索方式简称为HQL。
QBC检索方式
使用QBC(Query By Criteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口。本章有时把QBC检索方式简称为QBC。
本地SQL检索方式
使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBC ResultSet结果集映射为持久化对象图。
HQL检索方式
HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下功能:
在查询语句中设定各种查询条件
支持投影查询,即仅检索出对象的部分属性
支持分页查询
支持连接查询
支持分组查询,允许使用having和group by关键字
提供内置聚集函数,如sum()、min()和max()
能够调用用户定义的SQL函数
支持子查询,即嵌入式查询
支持动态绑定参数
Session的find()方法以及Query接口
Session类的find()方法以及Query接口都支持HQL检索方式。
这两者的区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在Hibernate3.x版本中,已经淘汰了find()方法;而Query接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。
HQL检索步骤
//创建一个Query对象
Query query=session.createQuery("from Customer as c where "
+" c.name=:customerName "
+"and c.age=:customerAge");
//动态绑定参数
query.setString("customerName","Tom");
query.setInteger("customerAge",21);
//执行查询语句,返回查询结果
List result= query.list();
HQL检索步骤
(1)通过Session的createQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参数。
(2)动态绑定参数。Query接口提供了给各种类型的命名参数赋值的方法,例如setString()方法用于为字符串类型的customerName命名参数赋值。
(3)调用Query的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。
方法链编程风格
List result=session.createQuery("……")
.setString("customerName","Tom")
.setInteger("customerAge",21)
.list();
方法链编程风格能使程序代码更加简洁。
QBC检索方式
采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。
QBC API 提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。
QBC检索方式
//创建一个Criteria对象
Criteria criteria=session.createCriteria(Customer.class);
//设定查询条件,然后把查询条件加入到Criteria中
Criterion criterion1= Expression.like("name", "T%") ;
Criterion criterion2= Expression.eq("age", new Integer(21)) ;
criteria=criteria.add(criterion1);
criteria=criteria.add(criterion2);
//执行查询语句,返回查询结果
List result=criteria.list();
QBC检索步骤
(1)调用Session的createCriteria()方法创建一个Criteria对象。
(2)设定查询条件。Expression类提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteria的add()方法用于加入查询条件。
(3)调用Criteria的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Criteria的list()方法时,Hibernate执行的SQL查询语句为:
select * from CUSTOMERS where NAME like 'T%' and AGE=21;
方法链编程风格
List result=session.createCriteria(Customer.class)
.add(Expression.like("name", "T%")
.add(Expression.eq("age", newInteger(21))
.list();
比较运算(大于)
List list = session.createQuery("from Hx c where c.id>0")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.gt("id", new Integer(0)))
.list();
比较运算(不等于)
List list = session.createQuery("from Hx c where c.id<>0")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.not(Expression.eq("name", "zmx")))
.list();
比较运算(不等)
List list = session.createQuery("from Hx c where c.name is null")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.not(Expression.isNull("name")))
.list();
比较运算(范围)
List list = session.createQuery("from Hx c where c.name in(‘zmx’)")
.list();
String names[]={“zmx”,”hx”};
List list = session.createCriteria(Hx.class)
.add(Expression.in(“name”,names))
.list();
模糊查询
List list = session.createQuery("from Hx c where c.name like ‘Z%’")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.like(“name”,”Z%”)))
.list();
QBE查询(query by Example)
它是QBC的子功能,允许创建一个对象模板,然后检索出所有和模板相同的对象,但功能不是很强大,且只支持=和like运算符
Hx hx = new Hx();
hx.setAge(33);
List list = session.createCriteria(Hx.class)
.add(Example.create(hx)).list();
查询排序
HQL方式
List list = session.createQuery("from Hx c order by c.name")
.list();
QBC方式
List list = session.createCriteria(Hx.class)
.add(Expression.like("name","z%"))
.addOrder(Order.desc("name"))
.list();
分页查询
Query和Criteria接口都提供了用于分页显示查询结果的方法:
setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认情况下,Query和Criteria接口从查询结果中的第一个对象,也就是索引位置为0的对象开始检索。
setMaxResult(int maxResults):设定一次最多检索出的对象数目。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。
分页查询
//采用HQL检索方式
Query query = session.createQuery("from
Customer c
order by c.name asc");
query.setFirstResult(0);
query.setMaxResults(10);
List result = query.list();
//采用QBC检索方式
Criteria criteria = session.createCriteria(
Customer.class);
criteria.addOrder(
Order.asc("name") );
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list();
链索查询
List list = session.createQuery("from Hx")
.setFirstResult(0)
.setMaxResults(2)
.list();
List list = session.createCriteria(Hx.class)
.setFirstResult(0)
.setMaxResults(2)
.list();
检索单个对象
Query和Criteria都提供了返回单个对象的方法uniqueResult().
先调用setMaxResult(1)方法,把最大检索数目设为1,在调用uniqueResult()方法。
Hx hx = (Hx)session.createQuery("from Hx")
.setMaxResults(1)
.uniqueResult();
Hx hx = (Hx)session.createCriteria(Hx.class)
.addOrder(Order.asc("name"))
.setMaxResults(1)
.uniqueResult();
与对象属性绑定
Hx hx = new Hx();
hx.setAge("33");
List list = session.createQuery("from Hx as c where c.age=:age")
.setProperties(hx)
.list();
SQL内连接
内连接就是传统的连接操作,用join连接关联表,on作为连接条件,where指定其他限定条件的查询
如:
select hx.name,hx.age,hxhome.home from hx join hxhome on hx.id=hxhome.hxid
SQL左外连接
在结果表中包含第一个表中满足的所有纪录,如果是在连接条件上匹配纪录,则第二个表返回相应的值,否则第二个表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx left join hxhome on hx.id=hxhome.hxid
SQL右外连接
在结果表中包含第二个表中满足的所有纪录,如果是在连接条件上匹配纪录,则第一个表返回相应的值,否则第一个表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx right outer join hxhome on hx.id=hxhome.hxid
迫切左外连接
以下两种检索方式是等价的,它们都能同时迫切左外连接类B和类C:
//HQL迫切左外连接检索方式
from A a left join fetch a.b b left join fetch a.c c where b is not
null and c is not null
//QBC迫切左外连接检索方式
List result=session.createCriteria(A.class)
.setFetchMode("this.b",FetchMode.EAGER)
.setFetchMode("this.c",FetchMode.EAGER)
.add(Expression.isNotNull("this.b"))
.add(Expression.isNotNull("this.c"))
.list();
投影查询
select关键字用于选择对象的部分属性,例如:
Iterator it=session.createQuery(
"select c.id,c.name,o.orderNumber "
+ " from Customer c join c.orders o "
+" where o.orderNumber like 'T%'" ).list().iterator();
while(it.hasNext()){
Object[] row=(Object[])it.next();
Long orderNumber=(String)row[2];
System.out.println(id+" "+name+" "+orderNumber);
}
投影查询
HQL查询语句对应的SQL语句为:
select c.ID,c.NAME,o.ORDER_NUMBER
from CUSTOMERS c inner join ORDERS o
on c.ID=o.CUSTOMER_ID where o.ORDER_NUMBER like 'T%';
以上查询语句的查询结果如下:
+----+------+--------------+
| ID | NAME | ORDER_NUMBER |
+----+------+--------------+
| 1 | Tom | Tom_Order001 |
| 1 | Tom | Tom_Order002 |
| 1 | Tom | Tom_Order003 |
+----+------+--------------+
Query的list()方法返回的集合中包含三个对象数组类型的元素,每个对象数组代表以上查询结果的一条记录。
发表评论
-
一刻钟精通正则表达式(转)
2007-11-07 11:23 875想必很多人都对正则表达式都头疼。今天,我以我的 ... -
Map、ArrayList 的遍历
2007-11-08 12:50 834public static void main(String[ ... -
Hibernate 连接池
2007-11-16 16:50 730<session-factory> < ... -
再温java jkd 环境变量设置
2007-12-04 15:16 889JAVA_HOME: C:\Program Files ... -
JAVA之路(转)
2007-12-04 18:12 627很多网友问我学习Java有 ... -
JMail
2007-12-05 10:42 879一.创建html格式的邮件 ... -
JAVA 检测网络是否为连通状态 ping
2007-12-07 19:27 2524要用java检测网络资源是否可用,我们可以采用以下两种方法: ... -
JMail 异常: java.lang.NoClassDefFoundError: javax/activation/DataSource
2007-12-11 16:56 2798今天开发邮件系统,发送程序能在main函数中顺利运行. ... -
JAVA 常用正则表达试
2007-12-11 21:21 809"^\d+$" //非负整数(正整数 + ... -
Linux - Tomcat
2007-12-14 18:36 7631.使用ps -ax | grep tomcat可以查询出内存 ... -
有返回值 存储过程 的 调用
2007-12-18 20:03 731有返回值的存储过程的调用方法如下: public class ... -
ECLIPS 经典 快键
2007-12-21 11:42 765Ctrl+1 快速修复(最经典的快捷键,就不用多说了) ... -
eclips 恢复 误删文件
2007-12-23 13:25 783今天,把我差点气死了,一不小心误删了很多重要文件. 后来才到网 ... -
JSP 统计在线人数
2007-12-24 10:39 741package com.test;import javax. ... -
The Software Engineer
2007-12-24 13:40 606http://siyn.iteye.com/ http://w ... -
Summarization of web project
2007-12-27 09:37 644开始一个web项目前应该注意一些什么?就自己的开发 ... -
正则表达式--2
2008-01-02 16:19 625正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总 ... -
java 正则表达式 长期总结
2008-01-03 18:46 744匹配文件后缀名:Pattern.matches("^ ... -
Test
2008-01-07 16:08 765package com.ed.cnc.servletListe ... -
跟据Email 查找 SMTP 服务器
2008-01-12 20:51 832package com.roadway.edserver.u ...
相关推荐
通过HQL,可以编写类似SQL的查询语句来检索对象。 **特点**: - **面向对象**:查询结果自动转换为对象。 - **易于理解**:语法与SQL类似,易于上手。 - **灵活性**:支持复杂的查询逻辑,包括连接、分组、排序等。...
标题:“HIBERNATE检索策略” 描述:本文深入解析了HIBERNATE的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在...
本教程将深入探讨"day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询"的主题,通过源码分析和实际工具的应用,来提升数据库查询的效率。 首先,我们了解Hibernate的检索方式。在Hibernate中,...
QBC 是一种使用 Query By Criteria API 来检索对象的方式,该 API 封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口。 session.createCriteria(Xxx.class); 五、本地 SQL 检索 本地 SQL 检索是使用...
标题中的“day36 04-Hibernate检索方式:多表连接查询”表明这是一个关于Hibernate框架的教程,重点讲解如何在Hibernate中进行多表连接查询。在这个主题中,我们将深入探讨Hibernate的ORM(对象关系映射)机制以及...
### Hibernate检索方式详解 #### 一、概述 Hibernate是一个强大的对象关系映射(ORM)框架,它可以将Java对象与数据库表进行映射,使得开发者能够更方便地进行数据的持久化操作。在Hibernate中,提供了多种检索...
本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。...本地SQL检索方式
一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是基于类和对象的。你可以通过HQL来查询、更新和删除对象,而无需关心底层的SQL语法。...
### Hibernate数据检索(HQL)知识点详解 #### 一、简介 Hibernate 是一款开源的对象关系映射(ORM)框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。本文档基于...
在 Hibernate 中,数据检索可以使用 HQL 语句或 Criteria API 两种方式。HQL 语句是一种类似 SQL 的查询语言,用于定义查询条件和检索数据,而 Criteria API 则是一种基于对象的查询接口,用于构建查询条件和检索...
第17章 Hibernate的检索方式(上) 17.1 Hibernate的检索方式简介 17.1.1 HQL检索方式 17.1.2 QBC检索方式 17.1.3 本地SQL检索方式 17.1.4 关于本章范例程序 17.1.5 使用别名 17.1.6 多态查询 ...
Spring框架是Java领域最广泛使用的应用框架,而Hibernate则是流行的ORM(对象关系映射)解决方案。当这两个强大的工具结合,通过Hibernate Search模块,我们可以实现高效、灵活的全文检索功能。本示例将详细介绍如何...
4. **HQL(Hibernate Query Language)**:面向对象的查询语言,类似于SQL,但更接近Java的语法,用于检索和操作持久化对象。 5. **第二级缓存**:Hibernate支持查询结果的缓存,可以显著提高系统性能,特别是对于...
它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地 SQL 查询等。 在 Hibernate 中检索对象的各种方法: 1. 导航对象图:通过对象的关联关系,...
一份我在厦门邦初学习 的快速入门ppt 内容有: 对象持久化基础知识 Hibernate应用开发基础 Hibernate对象关系映射...Hibernate检索数据的方式 数据库事务与并发处理 组件及组成关系映射 综合项目应用:Struts+Hibernater
在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码逻辑,使得开发过程更加高效。Hibernate支持两种...
一、Hibernate检索方式概述 Hibernate提供了多种检索数据的方法,以适应不同的需求场景。这些方法包括:HQL(Hibernate Query Language)、QBC(Query By Criteria)、Criteria API以及直接使用Session的get()和load...