指点成金-最美分享吧

登录

知识大全 Hibernate的HQL多表联合查询使用left join方式

佚名 举报

篇首语:胸怀万里世界, 放眼无限未来。本文由小编为大家整理,主要介绍了知识大全 Hibernate的HQL多表联合查询使用left join方式相关的知识,希望对你有一定的参考价值。

Hibernate的HQL多表联合查询使用left join方式  以下文字资料是由(全榜网网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  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