最早接触Hibernate是在2004年,当时怀着忐忑和不安的心情来学习这门技术。经过这几年的使用和研究,也积累了一定的经验,下面就HQL和QBC查询来谈一下我从工作中得到的一些总结。
本文不会讲什么是Hibernate、什么是ORM、更不会谈怎样使用HQL和QBC查询.本文的目的是让大家对平常使用最多,也是最广泛的与数据库打交道的两种方式,有一个新的认识。
恩,如果你还不知道Hibernate,大象建议你先去学一下再来看本文,如果你已经是这方面的高手,大可以关掉浏览器,千万不要因为本人的愚见,让你对大象口诛笔伐,进行人身攻击。
HQL和QBC查询检索的方式,最开始,我一直使用的都是HQL,因为以前一直用的都是SQL,觉得这东西和SQL差不多,上手很快。后来又用QBC,因为QBC是基于接口和类的对象化查询,使代码变得很清晰,很整洁。
下面是查询用户表中,id为2,年龄等于21,并且名字以J开头的两种查询语句,它们的结果都是一样,只是不同的表现方式。
HQL:
Query query = session.createQuery
("from User u where u.id = 2 and u.age = 21 and u.name like 'J%'");
List list = query.list();
QBC:
Criteria criteria = session.createCriteria(User.class);
List list = criteria.add(Expression.eq("id", 2)).
add(Expression.eq("age", 2)).add(Expression.like("name", "J%")).list();
如果查询再复杂一点,需要关联多张表,那上面这个HQL语句就会显得很复杂,比较难以阅读。对于QBC来说,需要再加一个createCriteria(),返回一个criteria新实例,比如说,用户表与帐号表关联,需要根据帐号表中的帐号,开户时间,金额等信息进行查询,可以写成下面的形式:
List list = criteria.add(Expression.eq("id", 2)).add(
Expression.eq("age", 2)).add(Expression.like("name", "J%"))
.createCriteria("account", "a").add(
Expression.eq("a.account_id", 112546)).add(
Expression.eq("a.start_date", "2008-8-30")).add(
Expression.eq("a.money_sum", 1000)).list();
account是用户表中建的与帐号表的关联对象属性,a是别名。我为了便于说明,用的都是固定值,并且条件判断也都是eq(等于),其实在实际开发中,这是不可能的,这些值全都会被变量所代替。add方法也不用写在一起,可以分开来,特别是在查询中,需要对传入的参数进行检验,这时就需要一个条件一个条件的往上加。
这样看来,好像QBC比HQL要好一些,大象是这么认为的:HQL简单、灵活,QBC整洁、方便,不能说谁好谁不好,否则大名鼎鼎的Hibernate为什么要支持这两种检索方式呢?
根据本人做开发的情况来看,在需要多表关联查询的时候,如果POJO类之间建立一对多或多对多这样的关联关系,效率是很低下的,就算你设置了延迟检索,也会感觉很慢。而且在实际开发中,我还发现,在数据库中建立外键是一件非常吃力不讨好的事情,因为很多时候出错都是跟外键有关系,主要体现在修改和删除。而 POJO之间建立对象关系,则会增加编码的复杂程度,提高出错机率,另外还会增加用户等待的时间。这是大象以前开发时所经历过的,所以后来的项目中,对于数据库中的每个表,只给一个流水号主键,不在建立其它的外键关系,而在POJO中,只设定最原始的属性与表中的字段对应,对于需要做多表查询的情况,建立视图,把需要查询的字段属性与要在列表中显示的字段属性都放在视图POJO中,这样,不管是HQL还是QBC,一个类就可以解决问题,而且对视图查询可比使用表之间的关联关系查询要快很多。
在项目中,到底采取哪种检索方式,关键还得看项目负责人。比如大象现在做的这个项目就规定了,必须使用QBC,而且除报表外,不准使用视图。呵呵,这样的情况,只能在POJO之间建立关联关系了,不过能少建,我们还是会尽量的减少类之间的关联,好在现在开发用的 JDK是5.0的,因此我们可以使用注解的方式定义一些临时对象属性,这样也省掉了以前必须得写的hbm.xml文件,有时也采用仿视图的方式用JavaBean来封装一些对象和属性。
大家看到这里,有什么想法呢?欢迎大家提出自己宝贵的意见,我们一起来学习和研究,共同分享成功的经验。
转自:http://developer.51cto.com/art/200909/153619.htm
分享到:
相关推荐
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...
### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。...希望本文能帮助读者更好地理解和运用Hibernate HQL关联查询技术。
HQL(Hibernate Query Language)和QBC(Query By Example)是Hibernate提供的两种主要的查询方式,它们提供了灵活且强大的查询能力。下面将详细阐述这两种查询方式以及它们的查询条件。 **HQL(Hibernate Query ...
HQL提供了一种面向对象的查询方式,QBC和QBE则提供了更多灵活性,可以根据需求动态构建查询。同时,理解这些概念也有助于开发者更好地与其他Java ORM框架(如MyBatis)进行比较和选择。在学习和使用过程中,参考官方...
其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和对象的方式进行数据查询。本文将对Hibernate HQL查询语法进行总结,涵盖基础查询、属性查询、实例化查询以及查询链接等多个...
### Hibernate HQL 查询详解 #### 一、HQL(Hibernate Query Language)简介 ...综上所述,HQL提供了强大且灵活的方式来查询Hibernate管理的对象,通过掌握上述技巧,可以更加高效地管理和操作数据。
之前也发了一个,这个包含之前的,还添加了hibernate对数据库操作的代码(注意:controller层两个QBC/SQLTest代码不能运行,只是写出了操作数据库的除了HQL的另外2种方式)。我发现现在还是有很多公司用hibernate+...
Hibernate HQL基础练习小列子+数据库
在“Hibernate HQL.zip_更新”这个压缩包中,我们可以找到关于使用Hibernate HQL进行插入、查询和更新操作的详细信息。 **1. Hibernate HQL 插入:** 在Hibernate中,插入数据通常通过Session对象的save()或...
它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地 SQL 查询等。 在 Hibernate 中检索对象的各种方法: 1. 导航对象图:通过对象的关联关系,...
标题"Hibernate_QBC和Hibernate_QBE"提及了两个关于Hibernate的查询方式,即Query By Criteria(QBC)和Query By Example(QBE)。Hibernate是Java领域中一个广泛使用的对象关系映射(ORM)框架,它允许开发者以面向...
### Hibernate HQL 基本查询详解 #### 一、HQL 概述 HQL (Hibernate Query Language) 是一种面向对象的查询语言,由 Hibernate 官方提供,用于简化数据库查询过程。与传统的 JDBC 方式相比,使用 HQL 进行数据库...
Hibernate HQL 查询语句是 Hibernate 框架中的一种查询语言,它提供了更加丰富的和灵活的查询特性,具有类似标准 SQL 语句的查询方式,同时也提供了更加面向对象的封装。以下是 Hibernate HQL 查询语句的知识点总结...
以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...
对hibernate的hql进行了详尽的讲解
总之,Hibernate-HQL是Java开发中处理数据库查询的重要工具,通过理解和熟练运用HQL,可以显著提高开发效率,降低维护成本。通过深入学习和实践,开发者可以更好地驾驭这个强大的查询语言,提升项目开发的质量和效率...
Hibernate 中,HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者用类名、属性和关联来编写查询,而不是直接使用数据库的SQL语句。HQL的基础包括了各种查询条件的设定,这些条件使得我们可以...
下面我们将深入探讨Hibernate的HQL模糊查询及其应用。 一、HQL概述 HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接...
根据提供的文件信息,我们可以深入探讨Hibernate HQL(Hibernate Query Language)的相关知识点,特别是关于其查询功能、连接操作、条件过滤以及聚合函数的应用等。 ### Hibernate HQL简介 Hibernate HQL是一种...