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.PersistenceException: org.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)
请知道的朋友帮忙解决,非常感谢。

解决方案 »

  1.   

    补充:
    使用JPA2.0进行查询,和上述效果一样。
            String sql = "SELECT a.NAME ddddd,ec.name resourcesName FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id";
            EntityManager em = Persistence.createEntityManagerFactory("xxxxx").createEntityManager();
            Query query = em.createNativeQuery(sql);
            List list = query.getResultList();
            System.out.println(list);
            em.close();
      

  2.   

    createSQLQuery 才是执行SQL吧
    createQuery 执行的是HQL
      

  3.   

    实在抱歉。我上面的帖子写错了。
    我实际用的就是createSQLQuery,不是createQuery,但是出现了上面的情形。
      

  4.   

    java.sql.SQLException: Column 'name' not found
    你的2个表中的字段是否叫name?
      

  5.   

    SELECT a.id,a.name FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
    查询结果正确SELECT a.id,ec.name FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
    查询结果正确SELECT a.id,a.name,ec.name FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
    查询不报错,但结果中两个name的值都是a.name的值。上一条sql语句加上别名
    SELECT a.id,a.name ggggg,ec.name FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
    查询不报错,但结果中两个name的值都是ec.name的值。颠倒一下两个name的顺序,结果变化了:
    SELECT a.id,ec.name,a.name FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
    查询不报错,但结果中两个name的值都是ec.name的值。上一条加上别名,查询结果又变了。
    SELECT a.id,ec.name fffff,a.name FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
    查询不报错,但结果中两个name的值都是a.name的值。两个都加别名
    SELECT a.id,ec.name fffff,a.name ggggg FROM eam_alert a,eam_resource ec WHERE a.resource_id=ec.id
    报错了,说“Column 'NAME' not found”。
      

  6.   

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

  7.   

    换种查询方法,用QBC或HQL查询
      

  8.   

    开发工程师没空验证。
    我也没空了。
    先结了。
    感觉luman2002说的有道理。