读书人

hibernate查询之HQL(二)

发布时间: 2012-09-08 10:48:07 作者: rapoo

hibernate查询之HQL(2)

我们上次一起学习HQL,知道了怎么使用HQL,现在我们继续来学习一下HQL的其他方面,如通过配置文件来进行配置。

有些项目组有一些奇怪的规定,不许在代码中出现SQL语句,如果这是一个规范,那我见过的我们公司的代码,全部都是不合格的,杯具的一大堆字符串拼接,看着就郁闷啊。维护现有项目的人真是伤不起啊。

代码中不允许出现SQL语句,这是建议是不错,但还是要看场合。我们来看一下Hibernate怎么把HQL配置在映射文件中。

直接看配置文件:

?大家只要做一下相应的包名修改就可以了。

下面我们正式进行测试:

在测试前我们看一下表中的数据:

t_address表数据如下:

hibernate查询之HQL(二)

t_user表数据如下:

hibernate查询之HQL(二)

1)首先我们看一下inner join,它在HQL中由inner join fetch,注意这里fetch的意思是指把需要的数据取出来,如果不用fetch,我们取出来的数据是Object[]数据类型的。

我们先看一下

?

我们可以看到hibernate将它转换成inner join语句,并查出address。

我们看到结果中并没有shun4这个记录,因为他并没有相应的address与它记录。

?

而我们用inner join而不要fetch时,它打印的语句为:

?我们看到,尽管shun4没有对应的adress,但还是把它查出来,left outer join是指把左边表的记录全部查出。

没有fetch的情况这里就不讲了。

?

3)接下来我们看一下right outer join,看名字肯定就和left outer join有点关系的,我们直接看例子就可以明显看出了。

?这里我们可以看到address为Test4的并没有相应的user与它对应,但它还是并查出来了,right outer join是指把右边表的记录全部查出。

fetch的情况如上,如果不明白可以看一下inner join fetch。

?

4)接下来我们看最后一个full join,这个用得比较少,我们就大概看一下:

实际上前面两个理解了,这个就不难理解了,只是把前面两个的结果结合一下而已。

我们直接看例子:

org.hibernate.AssertionFailure: undefined join type 23

?这个错误暂时没找到解决方法,可能是hibernate的bug,等以后我们深入源代码时再重回来看看。

?

?

HQL当然也是可以用子查询和多表联合查询的啦,这个就不多讲了。

HQL我们就学习到这里啦,以后会有更多高级的,我们再继续研究。

读书人网 >软件架构设计

热点推荐