Hibernate提供以下几种检索对象的方式。
l 导航对象图检索方式。(根据已经加载的对象,导航到其他对象。)
l OID检索方式。(按照对象的OID来检索对象。)
l HQL检索方式。(使用面向对象的HQL查询语言。)
l QBC检索方式。(使用QBC(Qurey By Criteria) API来检索对象。)
l 本地SQL检索方式。(使用本地数据库的SQL查询语句。)
一、Hibernate的检索方式简介
1、HQL检索方式
HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下功能:
l 在查询语句中设定各种查询条件。
l 支持投影查询,即仅检索出对象的部分属性。
l 支持分页查询。
l 支持分组查询,允许使用having和group by关键字。
l 提供内置聚集函数,如sum()、min()和mac()。
l 能够调用用户定义的SQL函数。
l 支持子查询,即嵌入式查询。
l 支持动态绑定参数。
Session类的find方法及Qurey接口都支持HQL检索方式。区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在将来新的Hibernate版本中,有可能淘汰find方法;而Qurey接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。
注:Qurey接口支持方法链编程风格,它的set方法都返回自身实例,而不是返回void类型。方法链编程风格能使程序代码更加简洁。
示例代码:
Query query = session .createQuery("from Customer as c where " +"c.name=:customerName and c.age=:customerAge"); // 动态绑定参数 query.setString("customerName", "Test"); query.setInteger("customerAge", 21); // 执行检索 List result = query.list(); // 方法链编程风格 List result1 = session.createQuery( "from Customer as c where c.name=:customerName" + " and c.age=:customerAge").setString( "customerName", "Test").setInteger("customerAge", 21)
.list();
2、QBC(Qurey By Criteria)检索方式
采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。
示例代码:
Criteria criteria = session.createCriteria(Customer.class); Criterion criterion1 = Expression.like("namr", "T%"); Criterion criterion2 = Expression.eq("age", new Integer(21)); criteria = criteria.add(criterion1); criteria = criteria.add(criterion2); // 执行检索 List result = criteria.list(); // 方法链编程风格 List result1 = session.createCriteria(Customer.class).add( Expression.like("namr", "T%")).add(
Expression.eq("age", new Integer(21))).list();
Hibernate还提供了QBE(Qurey By Example)检索方式,它是QBC的子功能。QBE允许先创建一个随想模板,然后检索出和这个样板相同的对象。
示例代码:
Customer exampleCustomer=new Customer(); exampleCustomer.setAge(21); List result1 = session.createCriteria(Customer.class).add(
Example.create(exampleCustomer)).list();
QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持“”和“”比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。
3、SQL检索方式
采用HQL或QBC检索方式时,Hibernate生成标准的SQL查询语句,使用于所有的数据库平台,因此这两种检索方式都是跨平台的
有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。
示例代码:
Query query = session.createSQLQuery("select {c.*} from CUSTOMER as c where c.NAME like :customerName and c.AGE=:customerAge"); // 动态绑定参数 query.setString("customerName", "Test"); query.setInteger("customerAge", 21); // 执行检索
List result = query.list();
4、使用别名
通过HQL检索一个类时,如果查询语句的其他地方需要引用它,应该为这个类指定一个别名,as关键字用于设定别名,也可以将as关键字省略。
QBC检索不需要由应用程序显式指定类的别名,Hibernate会自动把查询语句中的跟结点实体赋予别名“this”。
5、多态查询
HQL和QBC都支持多态查询,多态查询是指查询出当前类及所有子类的实例。多态查询对接口也使用。Hibernate不仅对from子句显式指定的类进行多态查询,而且对其他关联的类也会进行多态查询。
6、对查询结果排序
HQL和QBC都支持对查询结果进行排序。
query = session.createQuery("from Customer as c order by c.name");
//排序 criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("age"));
7、分页查询
Query和Criteria接口都提供了用于分页显式查询结果的方法。
l setFirstResult(int firstResult):设置从那个对象开始检索,参数表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认从0检索。
l setMaxResult(int maxResults):设置一次最多检索出的对象数目。默认检索所有。
示例代码:
criteria = criteria.add(criterion1); criteria = criteria.add(criterion2); criteria.setFirstResult(0); criteria.setMaxResults(10); // 执行检索
List result = criteria.list();
query.setString("customerName", "Test"); query.setInteger("customerAge", 21); query.setFirstResult(0); query.setMaxResults(10); // 执行检索
List result = query.list();
8、检索单个对象
Query和Criteria接口都提供了以下用于查询语句并返回查询结果的方法。
l list()方法:返回一个List类型的查询结果。
l uniqueResult()方法:返回单个对象。
注:Query接口还提供了一个iterate()方法,它和list()方法一样,能返回所有满足条件的持久化对象,但是两者使用不同的SQL查询语句。
示例代码:
// 单个检索 Customer customer = (Customer) session.createQuery( "from Customer as c order by c.name").setMaxResults(1)
.uniqueResult();
// 单个检索 Customer customer = (Customer) session.createCriteria(
Customer.class).setMaxResults(1).uniqueResult();
如果明明知道一个对象,可以不调用setMaxResults(1)方法。
9、在HQL查询语句中绑定参数
A、按参数名字绑定。咋HQL中定义命名参数以“:”开头。
B、按照参数位置绑定。在HQL查询语句中用“?”来定义参数的位置。
示例代码:
Query query = session.createQuery("from Customer as c where " + "c.name=? and c.age=?"); // 动态绑定参数 query.setString(0, "Test");
query.setInteger(1, 21);
除了以上用于绑定映射类型的参数的方法,Hibernate还提供了以下三个特殊的参数绑定方法。
(1)setEntity()方法:把参数与一个持久化类的实例绑定。(用id关联)
(2)setParameter()方法:绑定任意类型的参数。
(3)setProperties()方法:用于把命名参数与一个对象的属性值绑定。
分享到:
相关推荐
Hibernate检索方式 孙卫琴的 pdf
NULL 博文链接:https://364232252.iteye.com/blog/2368725
NULL 博文链接:https://364232252.iteye.com/blog/2368583
Hibernate的检索方式: 5种
介绍了HIBERNATE的检索策略,可以此作为指引进行学习
java-Hibernate 检索
hibernate5--4.检索方式及策略
Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记
魔乐科技,李兴华老师的Hibernate教程笔记,对Hibernate的基础知识进行了比较详细的讲解,对初学者有一个比较笼统的介绍,是带我们入门Hibernate的不二选择。
基于Spring的Hibernate Search全文检索功能示例 实例下载
mybatie和hibernate相关面试题,包括常用xml标签,一二级缓存等信息hibernate优化以,hibernate在Java中的三种状态,hibernate检索方式
Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。...本地SQL检索方式
hibernate的注解开发 注解开发关联映射 HQL、QBC、本地SQL检索数据
Hibernate数据检索(HQL).rar
总结hibernate框架的常用检索方式 1、hibernate框架的检索方式有以下几种: OID检索:根据唯一标识OID检索数据 对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC...
使用hibernate search实现全文检索和文档管理功能: 1 全文检索 2 手动生成索引 3 文档上传(自动建立索引) 4 文档更新(自动建立索引) 5 文档删除 使用说明: 1 需要先恢复数据库 searchDB_2008sqlserver.bak 2 ...
本PPT描述了对SHH框架中hibernate数据检索功能的描述,用户可以更快的学习Hibernate数据检索
hibernate的延迟检索在轻量级J2EE框架中的应用