您的位置:首页 > 数据库

hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法

qq_14946973 2016-12-28 13:36 211 查看
注:实际业务中可能比较复杂不得不用原生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)
标签: 
相关文章推荐