left join 效率 Hibernate的HQL多表联合查询使用left join方式
Hibernate的HQL多表联合查询使用left join方式
Hibernate不支持left join带on的条件查询
解决办法 使用原生SQL或者使用HQL方式需要修改hbm文件(如果项目中大部分不适用级联配置情况下)
需求是查询网络信息 网络信息中关联了分区 网络IP( 个网络 N个网络IP) 网桥信息
HQL:
public void queryVnets(Page page) {
StringBuffer hql = new StringBuffer()
hql append( select new Map(vn id as id vn vnName as vnName b name as vnType )
hql append( vn vnIptype as vnIptype vn vnIp as vnIp vn vnNat as vnNat vn vnFlag as vnFlag )
hql append( vn vnetFlag as vnetFlag (case when sum(vmvn state)= then else end) as vnState )
hql append( vn useType as useType vn createTime as createTime )
hql append( zone oneName as oneName zone oneHypervisor as oneHypervisor zone oneSeq as oneSeq) )
hql append( from VnetTable vn ZoneTable zone BridgeTable b )
hql append( left join fetch vn VnTables vmvn where zone id = vn zoneId and vn vnType = b id )
… …
hql append( group by vn id )
if (vnState != null && ! equals(vnState)) {
if ( equals(vnState)) {
hql append( having sum(vmvn state)= )
} else if ( equals(vnState)) {
hql append( having sum(vmvn state)!= )
}
}
}
hbm配置文件
<?xml version= encoding= utf ?>

<!DOCTYPE hibernate mapping PUBLIC //Hibernate/Hibernate Mapping DTD //EN
hiber/hibernate mapping dtd >
<!
Mapping file autogenerated by MyEclipse Persistence Tools
>
<hibernate mapping>
<class name= base mapping VnetTable table= vnet_table >
<id name= id type= java lang String >
<column name= ID length= />
<generator class= uuid hex />
</id>
<property name= vnId type= java lang Long >
<column name= VN_ID >
<ment>创建虚拟网络时得到的ID</ment>
</column>
</property>
…
<property name= zoneId type= java lang String >
<column name= ZONE_ID length= >
<ment>分区ID</ment>
</column>
</property>
<property name= vlanId type= java lang Integer >
<column name= VLAN_ID >
<ment>VLAN_ID</ment>
</column>
</property>
<set name= vnTables lazy= false order by= id asc inverse= false fetch= join cascade= all >
<key column= VN_NID />
<one to many class= base mapping VnTable />
</set>
</class>
</hibernate mapping>
理解inverse和cascade
总结
<one to many>中 建议inverse= true 由 many 方来进行关联关系的维护
<many to many>中 只设置其中一方inverse= false 或双方都不设置
Cascade 通常情况下都不会使用 特别是删除 一定要慎重
操作建议
一般对many to one和many to many不设置级联 这要看业务逻辑的需要 对one to one和one to many设置级联
lishixinzhi/Article/program/Java/ky/201311/28554