hibernate引用查询和联合查询

一、引用查询

日常开发时常会如下的编码规范:“代码中不允许出现sql语句”,其实这里面的意图其实很明显,sql语句混杂在代码之间会破坏代码的可读性和维护性,此时,有人难免失望,那怎么办,难道让我开发到这里,写了这么多的配置文件,突然之间就去换成ibatis???噩梦啊.......

 

其实大可不必,为了符合上述的编码规范,我们通常采用sql配置化的方式,将sql语句保存在配置文件中,需要调用或修改的时候,直接去读取配置就行了。而然,hibernate本身也提供了内置的支持。[注:我想大多数的公司都是会要求写在配置文件中的]

 

我们可以在实体类的配置文件中,通过query节点定义查询的语句,比如你原先想根据姓名查看user表会使用hql的"from User user where user.name=:name",那么我们可以在User.hbm.xml中使用如下配置:

 

Xml代码 
  1. <hibernate-mapping>  
  2.       <class name="com.entity.User" table="Tuser" batch-size="5">  
  3.              //.....其他字段属性定义略  
  4.        </class>  
  5.   
  6.   
  7.   
  8.         <query name="findByName">  
  9.                 <![CDATA[ 
  10.                         from User user where user.name=:name 
  11.                     ]]>  
  12.          </query>  
  13. </hibername-mapping>  

 

 

之后,我们即可通过sessio.getNamedQuery方法从配置文件中调用,代码如下:

 

Java代码 
  1. Query query =session.getNamedQuery("findByName");  
  2.   
  3. UserQuery uq=new UserQuery();  
  4. uq.setName("Cat");  
  5. uq.setAge(new Integer(22));  
  6.   
  7. query.setProperties(uq);  
  8.   
  9. Iterator it = query.iterate();  
  10. while(it.hasNext()){  
  11.     User user=(User)it.next();  
  12.     syso("user.getName()");  
  13. }  

 

二、联合查询

在sql中,通过join子句实现多表的联合查询,而hibernate的hql则提供了如下的联合查询机制:1、inner join  2、left outer join   3、right outer join     4、full join(不常用);这几种查询分别是与ANSI SQL中所定义的标准链接查询一一对应的。

 

假使我们这有两张表,User和Address表,结构如下:

 

IDName
1Cat
2Dog
3Penguin

Address
user_idaddress
1beijing
1shanghai
2guangzhou
6wuhan

 

结构很简单,就是Cat有两处住址,而Dog有一处住址,Penguin则没有房住

1、Inner Join:

 

from User user inner join fetch user.address
IDNAMEaddress
1Catbeijing
1Catshanghai
2Dogguangzhou

 

其中,我们注意到join后还有fetch关键字,该关键字的左右即读出数据后,立即填充到对于的User对象中去,将关联表的字段,填充到自己的属性,即多出现的那一属性栏,address。假使不用fetch的话,得到的结果将不会是个对象,而是存有User对象和Address对象的数组。

 

2、Left outer join:

 

from User user left join fetch user.address
IDNAMEaddress
1Catbeijing
1Catshanghai
2Dogguangzhou
3Penguin<NULL>
   

由此可见,它的结果是查询所有,左边的表的对应字段的相关数据,左表有几条数据,则查询出几条数据,与之一一对应,假使右表中有对应的数据即查出,没有则以NULL表示。

 

3、Right outer join:

 

顾名思义,我们可以想见,当换做右外连接查询时,将出现Address表所对应的所有数据即对应在User中的相关记录,假使没有,还是用NULL表示。

 

from User user right join user.address
IDNAMEaddress
1Catbeijing
1Catshanghai
2Dogguangzhou
<NULL><NULL><NULL>
   

细心的朋友可能会发现,右外连接时,没有了fetch关键字,这是怎么回事呢,其实对于连接查询而言,fetch关键字只是对inner join和left join有效,因为对于right join而言,由于作为关联对象的容器的User对象也可能为空,所以也就无法通过fetch关键字,强制使hibernate进行填充操作,因为当你的User对象也为空时,你在怎么填充,这个User也是空的,也就是相当于一条全空的数据,数据库自然是不允许出现一条空的数据,所以也查不到的。

 

所以这意味着,当我们使用right join的时候,得到结果后,我们将细分出自己所需要的数据,事例代码如下:

 

Java代码 
  1. String hql="from User user right join user.address";  
  2. List list=session.createQuery(hql).list();  
  3. Iterator it=list.iterator();  
  4. while(it.hasNext()){  
  5.     Object[]results=(Object[])it.next();  
  6.      User user;  
  7.      Address addr;  
  8.   
  9.      if((results[0]!=null)){  
  10.           user=(User).result[0];  
  11.           syso(user.getName());  
  12.       }else{  
  13.           syso("No corresoponding user");  
  14.       }  
  15.        
  16.        addr=(Address)result[1];  
  17.        syso(addr.getAddress());  
  18. }  

 

4、full join:

这个连接并不常用,假如hql还是如下的:from User user full join user.address,那么它将返回两张表记录的笛卡儿交集,即left join和right join的并集

 

5、其他表间查询,最常见的是将两表的数据合并查出,则有这个语句:from User,Address,这种的返回数据并没有太大意义,重复冗余很多,想必平时也没人会用到这种了。

 

好了,这引用查询和连接查询就算完了,希望能帮到大家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值