您的位置:首页 > 其它

hibernate HQL left join on 使用及多表连接取不同表(封装类)字段数据显示解决办法

2013-06-03 10:42 573 查看
在使用hibernate时,运用hql语句查询数据,使用join on多表连接查询,不能在hql中使用on,需在hibernate配置文件中配置好。

原本hql语句如下:

String sql="select o.wooHotlineInfoId.ponWorkNo,o.ponNumber,d.workId,o.workType," +
"o.nameCode,o.subNameCode,o.serviceCode,o.contidion,o.updateTime,o.versionCode"+
" from wopHotlineInfo o"+
" left join wopHotlineDetail d on o.wooHotlineInfoId.paiOrderNo = d.wopHotlineDetailId.ponWorkNo"+
" and o.wooHotlineInfoId.versionNo = d.wopHotlineDetailId.versionCode"+
" left join PonHotlineBackInfo r on r.ponWorkNo = o.wooHotlineInfoId.ponWorkNo || ':SS' ||"+
"o.wooHotlineInfoId.versionCode"+
" and o.wooHotlineInfoId.ponWorkNo in"+
"(select i.wooHotlineInfoId.ponWorkNo"+
" from wopHotlineInfo i"+
" left join wopHotlineDetail d on i.wooHotlineInfoId.ponWorkNo ="+
"d.wopHotlineDetailId.ponWorkNo"+
" and i.ponNumber = 'ponnumber')"+
" order by o.wooHotlineInfoId.ponWorkNo desc";
但在执行过程中是有错误的,left join on 需在配置文件中配置,在封装类WopHotLineInfo中增加属性:
private Set<WopHotlineDetail> wopHotlineDetailSet;

public Set<WopHotlineDetail> getWopHotlineDetailSet() {
return wopHotlineDetailSet;
}
public void setWopHotlineDetailSet(Set<WopHotlineDetail> wopHotlineDetailSet) {
this.wopHotlineDetailSet = wopHotlineDetailSet;
}
WopHotLineInf.hbm.xml增加配置:

<set name="wopHotlineDetailSet" table="com.ssh.work.po.WopHotlineDetail"
inverse="true" lazy="true" cascade="none" fetch="join">
<key>
<column name="PON_WORK_No" />
<column name="VERSION_CODE" />
</key>
<one-to-many not-found="ignore" class="wopHotlineDetail"/>
</set>


 修改后的hql语句为:
String sql="select o.wooHotlineInfoId.ponWorkNo,o.ponNumber,d.workId,o.workType," +
"o.nameCode,o.subNameCode,o.serviceCode,o.contidion,o.updateTime,o.versionCode"+
" from wopHotlineInfo o"+
" left join o.wopHotlineDetailSet d" +
" and o.wooHotlineInfoId.ponWorkNo in"+
"(select i.wooHotlineInfoId.ponWorkNo"+
" from wopHotlineInfo i"+
" left join wopHotlineDetailSet d "+
" and i.ponNumber = 'ponnumber')"+
" order by o.wooHotlineInfoId.ponWorkNo desc";
即可。

在前台页面使用struts2标签显示数据时,因多表连接查询设计到几个表,及几个封装类,查询到的list不能单独为某个封装类的list,所以在hql语句中要写明对应不同表的字段,增加一个普通的Bean封装类,包括显示多表字段的属性:

List list=query.list();

String ponWorkNo;
(...)

WopHotlineInfoBean wopHotlineInfoBean=new IbpIptvInfoBean();

List<WopHotlineInfoBean> wopHotlineInfoBeanList = new ArrayList<WopHotlineInfoBean>();

for(int i=0;i<list2.size();i++){
ponWorkNo=(String)((Object[])list.get(i))[0];
(...)
或者(
for (Object o : list) {
Object[] obj = (Object[]) o;
ponWorkNo=(obj[0].toString();
}
)

wopHotlineInfoBean.setPonWorkNo(ponWorkNo);

wopHotlineInfoBeanList.add(wopHotlineInfoBean);

}
return wopHotlineInfoBeanList;



前台jsp页面:

<s:iterator value="wopHotlineInfoBeanList ">
<tr>
<td><s:property value="ponWorkNo"/></td>
<td><s:property value=""/></td>
<td><s:property value=""/></td>
<td><s:property value=""/></td>
<td><s:property value=""/></td>
<td><s:property value=""/></td>
<td><s:property value=""/></td>
<td><s:property value=""/></td>
</tr>
</s:iterator>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate hql left join on
相关文章推荐