注:实际业务中可能比较复杂不得不用原生sql执行时可能会遇到该问题,为了描述问题,本例采用简单的举例
表1:
tbtask:
具有如下列:taskId,name,groupId
表2:
tbtaskGroup:
具有如下列:tbgroupId,name
使用原生sql表连接获取task表和group表的name信息
select task.name,group.name from tbtask task left join tbtaskGroup group on task.groupId=group.tbgroupId
至此阐述问题:
这个sql语句如果直接在mysql客户端执行的话没有任何问题,可以正确得到两个表的name值,但是如果使用hibernate执行原生sql的话会导致得到的结果并不是我们想要的结果,相同列直接发生了值得覆盖现象,甚至导致赋值错乱。
网上也有类似的问题,可能是我的方式不正确均未得到正确的解决办法,根据经验终于试验出了几种解决办法,现总结如下:
错误的方式1:直接命名别名
eq:String sql = select task.name taskName,group.name groupName from tbtask task left join tbtaskGroup group on task.groupId=group.tbgroupId
List list = this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
List result = session.createSQLQuery(sql).list();
return result;
}
});
return list;
debug发现问题仍然没解决,后台报错:找不到name字段
错误的方式2:使用{}
eq:String sql = select {task}.name taskName,{group}.name groupName from tbtask {task}left join tbtaskGroup {group} on {task}.groupId={group}.tbgroupId
仍然报错
正确解决方式1:
采用子查询重新给列起名
eq:String sql = select task.name taskName,group.groupName groupName from tbtask task left join (select tbgroupId,name as groupName from tbtaskGroup) group on task.groupId=group.tbgroupId
通过!!!!
正确解决方式2:
查询两次 这里只提供大概思路:首先得到task表的名称以及groupId 遍历循环根据groupId查询group表得到对应的group的name值
正确解决方式3:
给重复的列名给别名。然后通过addScalar()方式(参考:http://blog.sina.com.cn/s/blog_534f69a00101m2pp.html)