当前位置:编程学习 > JAVA >>

关于Hibernate:org.hibernate.exception.SQLGrammarException: could not execute query

在公司用 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)
…………
网上查了很多类似的,都没解决,大家给小弟看看,感激不尽啊!!!
Hibernate SQL Java --------------------编程问答-------------------- 哦,补充一下,下面少贴了个属性 private Integer id; --------------------编程问答-------------------- 只能说楼主的做法好蛋疼,createSql返回的list里面是数组,估计hibernate无法通过反射映射成实体,我没去试 --------------------编程问答-------------------- 这个方法我是从李刚的那本书里看到的,就想用这种办法来实际应用一下。 --------------------编程问答-------------------- Caused by: java.sql.SQLException: Column 'news_id' not found. 你数据库里有这个字段么  还是写错了 --------------------编程问答-------------------- NewsVo中没有news_id这个属性,你再看看数据库中有没有这个字段。 --------------------编程问答--------------------
引用 2 楼 shxt_xiaozhi 的回复:
只能说楼主的做法好蛋疼,createSql返回的list里面是数组,估计hibernate无法通过反射映射成实体,我没去试
这个不影响,我试过的, --------------------编程问答--------------------
引用 6 楼 zhongqian123 的回复:
Quote: 引用 2 楼 shxt_xiaozhi 的回复:

只能说楼主的做法好蛋疼,createSql返回的list里面是数组,估计hibernate无法通过反射映射成实体,我没去试
这个不影响,我试过的,
我虽然没去尝试,但是数组能映射成实体吗?太神奇了~ --------------------编程问答-------------------- 你可能需要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();
   --------------------编程问答-------------------- LZ+10086啊啊啊啊!我是一框架盲。。以前在框架上createSQLQuery,使用vo,想怎么用怎用。。。结果昨天就碰上这问题。。搞了两天,问了两天,搜了两天都没找到问题。。。
我是Select A as B ,A as C,D as E,因为有重复的A,只要加上as,hibernate就报这错。。 --------------------编程问答-------------------- @dracularking 
抱大腿!!虽然不知什么原理,以前可以,现在不行。但是万分感谢!
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,