hibernate 带条件外关联检索的方法

想在hibernate里实现如下SQL:

select   *
  
from  t_join_a a
  
left   outer   join  t_join_a_b c  on  a.a_id  =  c.a_id  and  c.b_id  =   ' b2 '
 
where  a.a_name  is   not   null

需要解决2个问题: 外关联和外关联中的条件, 希望下面的内容能够节省大家学习的时间

需要做下面的工作:

public   class  T_join_a  {
    
private String a_id;

    
private String a_name;

    
private Set t_join_b;
    
    
private Set t_join_a_b;

    
// 省略 getter/setter
}




public   class  T_join_a_b  implements  Serializable {

    
private static final long serialVersionUID = 8337568440339952023L;

    
private String a_id;

    
private String b_id;

    
private String t_join_a;

    
private String t_join_b;

    
// 省略 getter/setter

}



public   class  T_join_b  {
    
private String b_id;

    
private String b_name;

    
private Set t_join_a;

//     省略 getter/setter
}



 

HBM.XML配置如下:

 

<? xml version="1.0" ?>
<! DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" 
>

< hibernate-mapping  package ="demo.hibernate.join" >
    
< class  name ="T_join_a"  table ="t_join_a" >
        
< id  name ="a_id"  column ="a_id"  type ="string" >
            
< generator  class ="org.hibernate.id.UUIDHexGenerator"   />
        
</ id >
        
< property  name ="a_name"  column ="a_name"  type ="string"   />
        
        
<!--  通过 1对多 关联 t_join_a_b  -->
        
< set  name ="t_join_a_b"  table ="t_join_a_b"  lazy ="true"  inverse ="true"
            cascade
="all"   >             
            
< key  column ="a_id"   />
            
< one-to-many  class ="T_join_a_b"   />
        
</ set >
        
        
<!--  通过多对多关联 t_join_b  -->
        
< set  name ="t_join_b"  table ="t_join_a_b"  lazy ="true"  inverse ="false"
            cascade
="save-update" >
            
< key >
                
< column  name ="a_id"   />
            
</ key >
            
< many-to-many  class ="T_join_b"  column ="b_id"  
                outer-join
="auto"   />
        
</ set >
        
    
</ class >

</ hibernate-mapping >

 

<? xml version="1.0" ?>
<! DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" 
>

< hibernate-mapping  package ="demo.hibernate.join" >
    
< class  name ="T_join_a_b"  table ="t_join_a_b" >
        
< composite-id >
            
< key-property  name ="a_id"  column ="a_id"  type ="string"   />
            
< key-property  name ="b_id"  column ="b_id"  type ="string"   />             
        
</ composite-id >

        
< many-to-one  name ="t_join_a"  class ="T_join_a"  cascade ="none"
            outer-join
="auto"  update ="false"  insert ="false"  access ="property"
            column
="a_id"  not-null ="true"   />

    
</ class >

</ hibernate-mapping >

 

<? xml version="1.0" ?>
<! DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" 
>

< hibernate-mapping  package ="demo.hibernate.join" >
    
< class  name ="T_join_b"  table ="t_join_b" >
        
< id  name ="b_id"  column ="b_id"  type ="string" >
            
< generator  class ="org.hibernate.id.UUIDHexGenerator"   />
        
</ id >
        
< property  name ="b_name"  column ="b_name"  type ="string"   />

        
        
< set  name ="t_join_a"  table ="t_join_a_b"  lazy ="true"  inverse ="false"
            cascade
="save-update" >
            
< key >
                
< column  name ="b_id"   />
            
</ key >
            
< many-to-many  class ="T_join_a"  column ="a_id"
                outer-join
="auto"   />
        
</ set >
    
</ class >

</ hibernate-mapping >

 

最后HQL语法如下, hibernate里外关联不能写 on , 其中外关联里的条件是通过 hibernate 的 with 关键字实现的 :

select  new Map(a.a_id  as  a_id,a.a_name  as  a_name, c.b_id  as  b_id) 
 
from  T_join_a a   left   outer   join  a.t_join_a_b c 
  
with  c.b_id  =   ' b2 '

 

主要的java代码如下:

String hql;
Query query;
Iterator it;

hql 
=   " select new Map(a.a_id as a_id,a.a_name as a_name, c.b_id as b_id)  "
      
+   "  from T_join_a a  "   +   "  left outer join a.t_join_a_b c  "  
      
+   "  with c.b_id = 'b2' " ;

query 
=  session.createQuery(hql);
it 
=  query.list().iterator();
while  (it.hasNext())  {
    Map map 
= (Map) it.next();

    System.out.print(
"a_id : " + map.get("a_id"));
    System.out.println(
"  b_id : " + map.get("b_id"));
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值