`
cxshun
  • 浏览: 724605 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate查询之HQL(2)

阅读更多

我们上次一起学习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我们就学习到这里啦,以后会有更多高级的,我们再继续研究。

  • 大小: 3.8 KB
  • 大小: 3.6 KB
  • 大小: 6 KB
  • 大小: 7.5 KB
  • 大小: 7.4 KB
0
1
分享到:
评论

相关推荐

    hibernate查询之HQLhibernate查询之HQL

    Hibernate查询之HQL是ORM(对象关系映射)框架Hibernate中的一个重要组成部分,它是一种面向对象的查询语言,与SQL有着显著的区别。HQL允许开发者使用类名和属性而不是表名和列名进行查询,从而更好地适应面向对象的...

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...

    Hibernate查询语言HQL

    Hibernate查询语言HQL

    hibernate查询-hql教程

    hibernate查询-hql等教程,对于学习hibernate有很好的帮助。

    hibernateHQL关联查询

    其中,HQL(Hibernate Query Language)作为Hibernate提供的查询语言之一,允许开发者以接近面向对象的方式编写查询语句。本文将重点介绍Hibernate中的关联查询,并深入探讨HQL关联查询的实现原理及应用场景。 ####...

    hibernate查询语言hql

    Hibernate查询语言(HQL)是Java开发者用于操作Hibernate ORM框架中的对象关系映射数据的一种强大的查询工具。HQL是面向对象的,它允许开发者用类名和属性而不是表名和列名来编写查询,极大地提高了代码的可读性和可...

    hibernate 查询?Hibernate的HQL查询

    Hibernate作为流行的Java ORM框架,它的查询机制是其独特之处。其中,Criteria Query允许通过对象模型进行查询,提高了代码的可读性,但不支持所有复杂的SQL操作。而HQL则弥补了这一不足,它是一种面向对象的查询...

    Hibernate 课件_HQL

    ### Hibernate 课件_HQL 知识点解析 #### HQL查询 ...这些知识点涵盖了HQL的基本概念、查询方法、各种高级查询技巧以及Session的管理等方面,希望能够帮助大家更好地理解和掌握Hibernate的HQL查询技术。

    hibernate3-hql.jar

    hibernate3-hql.jar .

    Hibernate hql查询语法总结

    《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...

    Hibernate之HQL查询

    在Hibernate中,HQL(Hibernate Query Language)是其内置的一种面向对象的查询语言,它是SQL的面向对象版本,用于检索和操作持久化对象。HQL查询的使用极大地提高了开发效率,因为它将数据操作与具体的数据库结构...

    Hibernate(HQL、QBC查询)源码

    Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码

    HQL是hibernate自己的一套查询

    根据提供的标题、描述以及部分代码内容,我们可以了解到这段材料主要涉及的是Hibernate框架中的HQL(Hibernate Query Language)查询语言的使用。接下来将详细介绍HQL的相关知识点。 ### HQL概述 HQL是Hibernate...

    Hibernate注解方式、HQL查询

    本篇将详细探讨Hibernate的注解方式以及HQL(Hibernate Query Language)查询。 一、Hibernate注解方式 1. **实体类注解**:在Hibernate中,我们可以使用注解来定义一个Java类为数据库中的表。例如,使用`@Entity`...

    Hibernate实例开发 HQL 与 QBC 查询

    HQL的强大之处在于它可以处理复杂的查询,比如分组、排序、连接等,例如: ```java query = session.createQuery("from User u join u.roles r where r.name = 'Admin'"); users = query.list(); ``` 这个查询将...

    Hibernate教程(数据查询)HQL,PDF格式

    通过上述介绍,我们可以看到Hibernate和HQL的强大之处在于它们能够提供一种简单且直观的方式来处理数据库操作,特别是数据查询。对于那些希望在Java应用程序中集成数据库功能的开发者来说,掌握Hibernate和HQL是必不...

    Hibernate-HQL.rar_HQL_hibernate hql

    本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...

    hibernate的HQL的模糊查询

    下面我们将深入探讨Hibernate的HQL模糊查询及其应用。 一、HQL概述 HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接...

    hibernate查询语言--HQL

    Hibernate 查询语言 HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它是对SQL的封装,使得开发者可以使用面向对象的方式来处理数据库查询,避免了直接操作SQL带来的复杂性和对象与...

Global site tag (gtag.js) - Google Analytics