在公司用 Hibernate 的时候,功能需要得用 sql 语句而不是 hql,还得转换成 Vo 而不是实体,但是发现了一个问题,就是org.hibernate.exception.SQLGrammarException: could not execute query。回家后自己又写了个简单代码试验了一下,结果还是有问题,大家帮小弟瞧瞧是咋回事,焦头烂额了我的实验代码(贴个关键部分):
        
        String sql = "select news_id as id,news_title as title,news_content as content,news_author as author from news;";
        List list = session.createSQLQuery(sql)
.setResultTransformer(Transformers.aliasToBean(NewsVo.class))
.list();
        
其中 NewsVo 这个已经创建好了,如下
        
        private String title;
private String content;
private String author;
        /* getter 和 setter */
        
sql语句也在MySQL数据库中试验好了没问题,我又把 sql 语句换成 hql 语句试了试,也可以查出来,但是就是这个 sql 不行,错误信息如下:
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:2235)
…………
Caused by: java.sql.SQLException: Column 'news_id' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1167)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2851)
…………
网上查了很多类似的,都没解决,大家给小弟看看,感激不尽啊!!!
HibernateSQLJava

解决方案 »

  1.   

    哦,补充一下,下面少贴了个属性 private Integer id;
      

  2.   

    只能说楼主的做法好蛋疼,createSql返回的list里面是数组,估计hibernate无法通过反射映射成实体,我没去试
      

  3.   

    Caused by: java.sql.SQLException: Column 'news_id' not found. 你数据库里有这个字段么  还是写错了
      

  4.   

    NewsVo中没有news_id这个属性,你再看看数据库中有没有这个字段。
      

  5.   

    你可能需要addScalar来对应属性String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id   ";     
      
    List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql)        
      
                                         .addScalar("id", Hibernate.LONG)  
      
                                         .addScalar("name", Hibernate.STRING)       
      
                                         .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();  
      

  6.   

    LZ+10086啊啊啊啊!我是一框架盲。。以前在框架上createSQLQuery,使用vo,想怎么用怎用结果昨天就碰上这问题。。搞了两天,问了两天,搜了两天都没找到问题
    我是Select A as B ,A as C,D as E,因为有重复的A,只要加上as,hibernate就报这错。。
      

  7.   

    @dracularking 
    抱大腿!!虽然不知什么原理,以前可以,现在不行。但是万分感谢!