日期:2014-05-18  浏览次数:20777 次

有重名字段时,hibernate查询原生sql结果不正确或报错
hiberanete版本3.6.0和3.6.1都试了,效果一样。
mysql版本5.0

两个sql都有个特征,就是字段名称name出现了两次。
sql语句1:
SELECT a.NAME,ec.name resourcesName FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
使用jdbc直接查询,结果正确。
使用hibernate的getSession().createQuery(sql)查询,不报错,但结果不正确,结果中的两列的值都试a.NAME的值。

sql语句2:
SELECT a.NAME ddddd,ec.name resourcesName FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
使用jdbc直接查询,结果正确。
使用jdbc直接查询,结果正确。
使用hibernate的getSession().createQuery(sql)查询,报错,错误如下:
Exception in thread "main" javax.persistence.PersistenceExceptionorg.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255)
at JpaTest.main(JpaTest.java:12)
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2536)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
... 1 more
Caused by: java.sql.SQLException: Column 'name' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1136)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5531)


请知道的朋友帮忙解决,非常感谢。


------解决方案--------------------
这个我以前也遇到过
createSQLQuery查询,如果结果集字段名和映射文件的字段名相同的
那联合多表查询的时候会有问题
查询的时候用.addEntity()方法将表的别名和实体类联系起来就可以了
具体操作可以参考
http://www.360doc.com/content/10/1018/18/1947337_62026750.shtml