Hibernate原生SQL多表查询字段名重复问题
2012-05-03 03:16
531 查看
Hibernate原生SQL查询多表关联,SQL语句要注意的问题
@for&ever 2009-9-4
系统环境:
MySQL5.1
Hibernate3.3
有如下的假定:
实体类 Question 和 Answer分别对应数据表 question 和answer。
并且表 question 和answer 的字段大部分都一样,字段数目也一样。
执行如下的操作:
1>
使用hibernate 使用原生SQL查询,
Query q = session.createSQLQuery(sql).addEntity(Question.class).addEntity(Answer.class);
createSQLQuery执行的sql是如下的语句:
select b.*, a.* from question b left join answer a on a.id = b.ansId
在如上的addEntity 实体Question 和 Answer之后,查询可以进行,但是bean的注值错误。
具体现象为,question和answer两个实体查询出来后,数据混乱。
这个现象在Hibernate的官方文档中Native SQL Query一章有描述和具体的解决办法。
2>
于是按着 Hibernate 文档,修改SQL语句如下:
select {b.*}, {a.*} from question {b} left join answer {a} on {a}.id = {b}.ansId
执行查询后,报错:
Hibernate: select {b.*}, {a.*} from question {b} left join answer {a} on {a}.id = {b}.ansId
2009-09-04 20:03:53,625 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 1064, SQLState: 42000>
2009-09-04 20:03:53,625 ERROR [org.hibernate.util.JDBCExceptionReporter] - <You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near ' from question left join answer on .id = .ansId' at line 1>
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2231)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
3>
接着修改SQL语句为:
select {bbbb}.*, {aaaa}.* from question {bbbb} left join answer {aaaa} on {aaaa}.id={bbbb}.ansId
查询,报错如下:
2009-09-04 19:14:59,140 INFO [org.hibernate.type.IntegerType] - <could not read column value from result set: id10_0_; Column 'id10_0_' not found.>
2009-09-04 19:14:59,140 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 0, SQLState: S0022>
2009-09-04 19:14:59,140 ERROR [org.hibernate.util.JDBCExceptionReporter] - <Column 'id10_0_' not found.>
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
4>
最终修改为:
select {bbbb.*}, {aaaa.*} from question {bbbb} left join answer {aaaa} on {aaaa}.id={bbbb}.ansId
查询结果正常。
总结:
1、使用Hibernate 原生SQL查询,当多个表的关联时,或者返回多个表的字段时,最好要添加别名,并注意添加的别名的写法;
2、别名alias 的命名不要太短,如上面的例子, a --> aaaa , b --> bbbb ,查询就一切正常;
3、当多个表格关联使用原生SQL查询时,记得对每个要返回的实体 addEntity。
@for&ever 2009-9-4
系统环境:
MySQL5.1
Hibernate3.3
有如下的假定:
实体类 Question 和 Answer分别对应数据表 question 和answer。
并且表 question 和answer 的字段大部分都一样,字段数目也一样。
执行如下的操作:
1>
使用hibernate 使用原生SQL查询,
Query q = session.createSQLQuery(sql).addEntity(Question.class).addEntity(Answer.class);
createSQLQuery执行的sql是如下的语句:
select b.*, a.* from question b left join answer a on a.id = b.ansId
在如上的addEntity 实体Question 和 Answer之后,查询可以进行,但是bean的注值错误。
具体现象为,question和answer两个实体查询出来后,数据混乱。
这个现象在Hibernate的官方文档中Native SQL Query一章有描述和具体的解决办法。
2>
于是按着 Hibernate 文档,修改SQL语句如下:
select {b.*}, {a.*} from question {b} left join answer {a} on {a}.id = {b}.ansId
执行查询后,报错:
Hibernate: select {b.*}, {a.*} from question {b} left join answer {a} on {a}.id = {b}.ansId
2009-09-04 20:03:53,625 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 1064, SQLState: 42000>
2009-09-04 20:03:53,625 ERROR [org.hibernate.util.JDBCExceptionReporter] - <You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near ' from question left join answer on .id = .ansId' at line 1>
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2231)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
3>
接着修改SQL语句为:
select {bbbb}.*, {aaaa}.* from question {bbbb} left join answer {aaaa} on {aaaa}.id={bbbb}.ansId
查询,报错如下:
2009-09-04 19:14:59,140 INFO [org.hibernate.type.IntegerType] - <could not read column value from result set: id10_0_; Column 'id10_0_' not found.>
2009-09-04 19:14:59,140 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 0, SQLState: S0022>
2009-09-04 19:14:59,140 ERROR [org.hibernate.util.JDBCExceptionReporter] - <Column 'id10_0_' not found.>
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
4>
最终修改为:
select {bbbb.*}, {aaaa.*} from question {bbbb} left join answer {aaaa} on {aaaa}.id={bbbb}.ansId
查询结果正常。
总结:
1、使用Hibernate 原生SQL查询,当多个表的关联时,或者返回多个表的字段时,最好要添加别名,并注意添加的别名的写法;
2、别名alias 的命名不要太短,如上面的例子, a --> aaaa , b --> bbbb ,查询就一切正常;
3、当多个表格关联使用原生SQL查询时,记得对每个要返回的实体 addEntity。
相关文章推荐
- Hibernate原生SQL多表查询字段名重复问题
- hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
- hibernate 用原生sql多表查询 ,字段名重复会被覆盖
- Hibernate使用原生SQL多表查询时字段名相同导致查询数据覆盖问题解决办法
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- hibernate使用原生的sql,解决管理查询、结果集封装等问题
- 关于Hibernate在使用原生SQL语句多表查询所遇到的问题
- Hibernate 使用原生SQL查询oracle数据库显示问题(char,Date)
- hibernate原生sql查询映射java bean问题,出现Ljava.lang.object错误
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- 关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题
- Hibernate 使用原生SQL查询无法使用别名问题
- hibernate中的query查询原生sql语句,如何获得返回记录中的每一个字段的值
- 解决Hibernate原生SQL映射问题 - SQL查询出来的结果映射为值对象
- Hibernate原生sql查询返回结果问题
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- Hibernate 执行原生sql语句字段名相同会被覆盖的问题
- Hibernate SQL查询时有重名字段出现的问题
- Hibernate原生SQL查询