- 浏览: 724605 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
yukang1:
太适合新手了 谢主隆恩
tomcat结合nginx使用小结 -
singformyself:
确实,楼主写的很好。必须赞一个。让我这个nginx新手如获至宝 ...
tomcat结合nginx使用小结 -
光太狼Leon:
这才是真正对新手有用的文章。
tomcat结合nginx使用小结 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
JAVA webservice之CXF -
MCLoginandPwd:
如今,java技术框架太多了,给你分享一个好玩代码生成器,ht ...
论JAVA框架
我们上次一起学习HQL,知道了怎么使用HQL,现在我们继续来学习一下HQL的其他方面,如通过配置文件来进行配置。
有些项目组有一些奇怪的规定,不许在代码中出现SQL语句,如果这是一个规范,那我见过的我们公司的代码,全部都是不合格的,杯具的一大堆字符串拼接,看着就郁闷啊。维护现有项目的人真是伤不起啊。
代码中不允许出现SQL语句,这是建议是不错,但还是要看场合。我们来看一下Hibernate怎么把HQL配置在映射文件中。
直接看配置文件:
<query name="queryByName"> <![CDATA[ from User usr where usr.name=:name ]]> </query>
我们添加了一个这样的标签,它表明里面是HQL语句。
当我们需要取到这个语句时,也只需要在代码中加入一句:
Query query = session.getNamedQuery("queryByName");
这样也就取到了这个HQL语句。
HQL也可以用SQL中的组合查询,比如inner join,left outer join,right outer join,full join。
下面我们来看一下它们的用法:
还是先看一下实体类,我们测试中要用到的:
public class TUser implements Serializable{ private static final long serialVersionUID = 1L; private int id; private int age; private String name; private Set<Address> addresses = new HashSet<Address>(); //省略Get/Set方法 }
public class Address implements Serializable{ private static final long serialVersionUID = 1L; private int id; private String address; private TUser user; //省略Get/Set方法 }
下面我们看一下映射文件:
<hibernate-mapping package="org.hibernate.tutorial.domain6"> <class name="TUser" table="t_user" dynamic-insert="true" dynamic-update="true"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" type="java.lang.String" column="name"/> <property name="age" type="java.lang.Integer" column="age"/> <set name="addresses" cascade="all" table="t_address" inverse="true"> <key column="user_id" /> <one-to-many class="Address"/> </set> </class> </hibernate-mapping>
<hibernate-mapping package="org.hibernate.tutorial.domain6"> <class name="Address" table="t_address" dynamic-insert="false" dynamic-update="false"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native" /> </id> <property name="address" column="address" type="java.lang.String" /> <many-to-one name="user" class="TUser" column="user_id" not-null="true"></many-to-one> </class> </hibernate-mapping>
大家只要做一下相应的包名修改就可以了。
下面我们正式进行测试:
在测试前我们看一下表中的数据:
t_address表数据如下:
t_user表数据如下:
1)首先我们看一下inner join,它在HQL中由inner join fetch,注意这里fetch的意思是指把需要的数据取出来,如果不用fetch,我们取出来的数据是Object[]数据类型的。
我们先看一下
from TUser usr inner join fetch usr.addresses
当我们运行它时,我们看到hibernate输出为:
Hibernate: select tuser0_.id as id1_0_, addresses1_.id as id0_1_, tuser0_.name as name1_0_, tuser0_.age as age1_0_, addresses1_.address as address0_1_, addresses1_.user_id as user3_0_1_, addresses1_.user_id as user3_0__, addresses1_.id as id0__ from t_user tuser0_ inner join t_address addresses1_ on tuser0_.id=addresses1_.user_id
我们在mysql中运行可以看到结果:
我们可以看到hibernate将它转换成inner join语句,并查出address。
我们看到结果中并没有shun4这个记录,因为他并没有相应的address与它记录。
而我们用inner join而不要fetch时,它打印的语句为:
Hibernate: select tuser0_.id as id1_0_, addresses1_.id as id0_1_, tuser0_.name as name1_0_, tuser0_.age as age1_0_, addresses1_.address as address0_1_, addresses1_.user_id as user3_0_1_ from t_user tuser0_ inner join t_address addresses1_ on tuser0_.id=addresses1_.user_id
似乎语句没什么区别,但是当我们查出来后它得到的是Object[]数组类型的,这个解析的时候需注意。
当我们不用fetch,而只是inner join时,我们需要这样来解析:
Query query = session.createQuery("from TUser usr inner join usr.addresses"); List list = query.list(); Iterator iter = list.iterator(); while(iter.hasNext()) { Object[] results = (Object[])iter.next(); for (int i = 0; i < results.length; i ++ ) { System.out.println(results[i]); } }
我们看到打印的结果:
org.hibernate.tutorial.domain6.TUser@16925b0 org.hibernate.tutorial.domain6.Address@914f6a org.hibernate.tutorial.domain6.TUser@787d6a org.hibernate.tutorial.domain6.Address@71dc3d org.hibernate.tutorial.domain6.TUser@1326484 org.hibernate.tutorial.domain6.Address@16546ef
它的每个结果都是相应查出来的对象。
2)left outer join,这个相当于SQL的左连接,我们直接看一下例子:
from TUser usr left outer join fetch usr.addresses
当我们运行上面的语句时,hibernate打印出:
Hibernate: select tuser0_.id as id1_0_, addresses1_.id as id0_1_, tuser0_.name as name1_0_, tuser0_.age as age1_0_, addresses1_.address as address0_1_, addresses1_.user_id as user3_0_1_, addresses1_.user_id as user3_0__, addresses1_.id as id0__ from t_user tuser0_ left outer join t_address addresses1_ on tuser0_.id=addresses1_.user_id
我们在mysql中进行查出,看到:
我们看到,尽管shun4没有对应的adress,但还是把它查出来,left outer join是指把左边表的记录全部查出。
没有fetch的情况这里就不讲了。
3)接下来我们看一下right outer join,看名字肯定就和left outer join有点关系的,我们直接看例子就可以明显看出了。
from TUser usr right outer join fetch usr.addresses
我们执行它,得到Hibernate输出的结果语句为:
Hibernate: select tuser0_.id as id1_0_, addresses1_.id as id0_1_, tuser0_.name as name1_0_, tuser0_.age as age1_0_, addresses1_.address as address0_1_, addresses1_.user_id as user3_0_1_, addresses1_.user_id as user3_0__, addresses1_.id as id0__ from t_user tuser0_ right outer join t_address addresses1_ on tuser0_.id=addresses1_.user_id
我们在mysql中执行后可以看到结果:
这里我们可以看到address为Test4的并没有相应的user与它对应,但它还是并查出来了,right outer join是指把右边表的记录全部查出。
fetch的情况如上,如果不明白可以看一下inner join fetch。
4)接下来我们看最后一个full join,这个用得比较少,我们就大概看一下:
实际上前面两个理解了,这个就不难理解了,只是把前面两个的结果结合一下而已。
我们直接看例子:
from TUser usr full join fetch usr.addresses
我们执行它,很抱歉,不管怎样执行,我们都会得到一个错误:
org.hibernate.AssertionFailure: undefined join type 23
这个错误暂时没找到解决方法,可能是hibernate的bug,等以后我们深入源代码时再重回来看看。
HQL当然也是可以用子查询和多表联合查询的啦,这个就不多讲了。
HQL我们就学习到这里啦,以后会有更多高级的,我们再继续研究。
发表评论
-
一个小小的hibernate学习之作
2011-06-21 21:20 1668经过前段时间hibernate的 ... -
hibernate中的Interceptor
2011-06-06 18:05 4475讲到Interceptor,相信熟 ... -
Hibernate中的Collection小谈
2011-06-05 15:48 2172记得我们在以前例子中一对多中用到的Set,还有印象么,如果没 ... -
hibernate之二级缓存小谈
2011-06-03 21:31 1624上次我们一起学习了一下hibernate的一级缓存及在运行过 ... -
hibernate状态和缓存小谈
2011-05-30 22:59 1586前几次我们讲了一些比 ... -
hibernate之HQL(3)
2011-05-29 15:38 3316我们在之前一起学习了Hibernate的HQL查询语法。但我 ... -
hibernate查询之HQL
2011-05-28 09:57 2207上次我们一起学习了用 ... -
hibernate查询之Criteria(2)
2011-05-27 00:05 1520我们前面看了一下Criteria的基本用法,下面我们来了解一 ... -
hibernate查询之Criteria
2011-05-26 22:44 2190前几次我们讲了hibernate的关联映射,映射完了我们就要 ... -
hibernate关联映射之多对多
2011-05-25 22:38 1687我们学习了hibernate的一对一和一对多,下面就剩下一个 ... -
hibernate关联映射之一对多
2011-05-25 21:56 1494看了一对一的实现之后,我们来看一下hibernate中一对多 ... -
hibernate关联映射之一对一(外键关联)
2011-05-24 22:59 1568上次我们说了hibernate关联映射中的一对一关联,我们是 ... -
hibernate关联映射之一对一
2011-05-24 00:41 1263作为一个ORM框架,hibern ... -
hibernate层次设计(2)
2011-05-22 21:00 1282昨天我们了解了怎么使 ... -
hibernate层次设计
2011-05-21 23:04 1853这次我们来说一下hibernate的层次设计,层次设计也就是 ... -
hibernate自定义类型(2)
2011-05-21 12:06 1612昨天讲了自定义类型中会出现异常,今天我们就来解决一下异常,文 ... -
重拾hibernate——自定义类型
2011-05-20 22:56 4519从去年2月参加实习到现在已经差不多一年半没有碰三大框架啦,面 ...
相关推荐
Hibernate查询之HQL是ORM(对象关系映射)框架Hibernate中的一个重要组成部分,它是一种面向对象的查询语言,与SQL有着显著的区别。HQL允许开发者使用类名和属性而不是表名和列名进行查询,从而更好地适应面向对象的...
Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...
Hibernate查询语言HQL
hibernate查询-hql等教程,对于学习hibernate有很好的帮助。
其中,HQL(Hibernate Query Language)作为Hibernate提供的查询语言之一,允许开发者以接近面向对象的方式编写查询语句。本文将重点介绍Hibernate中的关联查询,并深入探讨HQL关联查询的实现原理及应用场景。 ####...
Hibernate查询语言(HQL)是Java开发者用于操作Hibernate ORM框架中的对象关系映射数据的一种强大的查询工具。HQL是面向对象的,它允许开发者用类名和属性而不是表名和列名来编写查询,极大地提高了代码的可读性和可...
Hibernate作为流行的Java ORM框架,它的查询机制是其独特之处。其中,Criteria Query允许通过对象模型进行查询,提高了代码的可读性,但不支持所有复杂的SQL操作。而HQL则弥补了这一不足,它是一种面向对象的查询...
### Hibernate 课件_HQL 知识点解析 #### HQL查询 ...这些知识点涵盖了HQL的基本概念、查询方法、各种高级查询技巧以及Session的管理等方面,希望能够帮助大家更好地理解和掌握Hibernate的HQL查询技术。
hibernate3-hql.jar .
《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...
在Hibernate中,HQL(Hibernate Query Language)是其内置的一种面向对象的查询语言,它是SQL的面向对象版本,用于检索和操作持久化对象。HQL查询的使用极大地提高了开发效率,因为它将数据操作与具体的数据库结构...
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
根据提供的标题、描述以及部分代码内容,我们可以了解到这段材料主要涉及的是Hibernate框架中的HQL(Hibernate Query Language)查询语言的使用。接下来将详细介绍HQL的相关知识点。 ### HQL概述 HQL是Hibernate...
本篇将详细探讨Hibernate的注解方式以及HQL(Hibernate Query Language)查询。 一、Hibernate注解方式 1. **实体类注解**:在Hibernate中,我们可以使用注解来定义一个Java类为数据库中的表。例如,使用`@Entity`...
HQL的强大之处在于它可以处理复杂的查询,比如分组、排序、连接等,例如: ```java query = session.createQuery("from User u join u.roles r where r.name = 'Admin'"); users = query.list(); ``` 这个查询将...
通过上述介绍,我们可以看到Hibernate和HQL的强大之处在于它们能够提供一种简单且直观的方式来处理数据库操作,特别是数据查询。对于那些希望在Java应用程序中集成数据库功能的开发者来说,掌握Hibernate和HQL是必不...
本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...
下面我们将深入探讨Hibernate的HQL模糊查询及其应用。 一、HQL概述 HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接...
Hibernate 查询语言 HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它是对SQL的封装,使得开发者可以使用面向对象的方式来处理数据库查询,避免了直接操作SQL带来的复杂性和对象与...