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、付费专栏及课程。

余额充值