hibernate查询之HQL(2)
我们上次一起学习HQL,知道了怎么使用HQL,现在我们继续来学习一下HQL的其他方面,如通过配置文件来进行配置。
有些项目组有一些奇怪的规定,不许在代码中出现SQL语句,如果这是一个规范,那我见过的我们公司的代码,全部都是不合格的,杯具的一大堆字符串拼接,看着就郁闷啊。维护现有项目的人真是伤不起啊。
代码中不允许出现SQL语句,这是建议是不错,但还是要看场合。我们来看一下Hibernate怎么把HQL配置在映射文件中。
直接看配置文件:
?大家只要做一下相应的包名修改就可以了。
下面我们正式进行测试:
在测试前我们看一下表中的数据:
t_address表数据如下:
t_user表数据如下:
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我们就学习到这里啦,以后会有更多高级的,我们再继续研究。