hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
2016-12-28 13:36
831 查看
注:实际业务中可能比较复杂不得不用原生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)
表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)
相关文章推荐
- Hibernate原生SQL多表查询字段名重复问题
- Hibernate使用原生SQL多表查询时字段名相同导致查询数据覆盖问题解决办法
- Hibernate原生SQL多表查询字段名重复问题
- 当Dao层继承了HibernateDaoSupport,使用底层SQL语句,session获取的方法,以及解决关联查询no session的问题
- hibernate使用原生的sql,解决管理查询、结果集封装等问题
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 关于Hibernate在使用原生SQL语句多表查询所遇到的问题
- 使用 Hibernate 在 JPA 中 调用 generateSchema 会出现执行两次 SQL 语句问题的解决方法
- 使用Hibernate 5.0、4.0、3.0 createSQLQuery执行原生Sql语句 遇到问题及解决办法集锦
- hibernate 用原生sql多表查询 ,字段名重复会被覆盖
- Hibernate3.2.6 原生sql 查询使用方法,将查询结果直接转换为POJO,不必非要指定属性大写
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- Linq to Sql 或linq to entities 与SQL 查询结果不一致,返回重复结果问题解决方法
- 执行SQL语句时出现问题操作必须使用一个可更新的查询错误的解决方法
- Hibernate 使用原生SQL查询oracle数据库显示问题(char,Date)
- hibernate使用hql跨表查询遇到的问题以及解决方式
- 使用ArcCatalog删除某个字段的问题以及解决方法
- 解决Hibernate原生SQL映射问题 - SQL查询出来的结果映射为值对象
- hibernate 使用延迟加载产生的问题以及对应的解决方法
- Hibernate 使用原生SQL查询无法使用别名问题