Java hibernate本机SQL查询错误
我想在hibernate 3.5中执行本机sql查询 我使用MySQL5作为dbms,在mysqlworkbench上测试了查询,得到了我想要的数据 因此,我在java代码中创建了一个SQLQuery对象,设置查询字符串和所需的参数 执行查询后,我得到一个异常,表示:Java hibernate本机SQL查询错误,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我想在hibernate 3.5中执行本机sql查询 我使用MySQL5作为dbms,在mysqlworkbench上测试了查询,得到了我想要的数据 因此,我在java代码中创建了一个SQLQuery对象,设置查询字符串和所需的参数 执行查询后,我得到一个异常,表示: org.hibernate.exception.SQLGrammarException: could not execute query .... Caused by: java.sql.SQLException: Column
org.hibernate.exception.SQLGrammarException: could not execute query
....
Caused by: java.sql.SQLException: Column 'name' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1145)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5617)
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:225)
at org.hibernate.type.StringType.get(StringType.java:41)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:210)
我的查询(直接在服务器上执行时工作正常):
以下是如何在java代码中创建查询字符串:
String queryString = "select site.name as constructionSiteName, site.id as constructionSiteId, " +
"sum(pos.sum_checked_brutto) as sumCheckedBrutto, sum(pos.sum_checked_netto) as sumCheckedNetto " +
"from constructionsite site " +
"inner join costunit cu on site.id = cu.constructionsite " +
"inner join costunit_position pos on pos.costunit_id = cu.id " +
"inner join company com on pos.company_id = com.id " +
"where com.id = ? " +
"group by site.id ";
然后我将其设置为SQLQuery对象,并设置参数:
SQLQuery query = getSession().createSQLQuery(queryString);
query.setLong(0, companyId);
最后一步是使用以下命令“执行”查询:
List result = query.list();
我真的不知道我做错了什么,非常感谢你的帮助
提前tnx
编辑:
由hibernate执行的生成的sql语句:
2011-05-19 10:42:50,143 DEBUG SQL:111 - select site.name as constructionSiteName,
site.id as constructionSiteId, sum(pos.sum_checked_brutto) as sumCheckedBrutto,
sum(pos.sum_checked_netto) as sumCheckedNetto
from constructionsite site
inner join costunit cu on site.id = cu.constructionsite
inner join costunit_position pos on pos.costunit_id = cu.id
inner join company com on pos.company_id = com.id where com.id = ?
group by site.id
我还在服务器输出中找到了这个:
2011-05-19 10:42:50,159 INFO StringType:203 - could not read column value from result set: name; Column 'name' not found.
请仔细检查表
站点
是否有名为名称
的列。(注意:MySQL表名可能区分大小写,具体取决于配置和底层操作系统。)
仔细检查应用程序是否使用与从SQL客户端执行查询的数据库完全相同的数据库。可能您的测试和生产环境中有两个不同版本的table
site
请尝试从SQL中删除列别名。我之前也遇到过类似的问题,这为我解决了这个问题。有些原生SQL查询在hibernate上运行时如何忽略列别名。我不知道为什么会这样
您的查询将是选择site.name、site.id、com.name,
总额(核对后的总额),
金额(已核对的金额净额)
从施工现场
内部连接成本单位cu on site.id=cu.constructionsite
内部连接成本单位\位置上的位置成本单位\ id=cu.id
pos.company\u id=com.id上的内部连接公司com
其中com.id=57
按site.id分组代码>它与MySQL JDBC相关。
将[useOldAliasMetadataBehavior=true]添加到配置文件中的JDBC url。
来源:是的,删除别名是可行的,但如果您有两个表,每个表都有一个名为name的列,则会出现问题
然而,如果我在ifnull(site.name)
中添加一个ifnull,这似乎是可行的。不知道为什么。ps:请不要被表名和列名弄糊涂了:D能否在分配后打印queryString的实际值2011-05-19 10:42:50143调试SQL:111-选择site.name作为constructionSiteName,site.id作为constructionSiteId,sum(pos.sum_checked_brutto)作为sumchecked brutto,sum(pos.sum_checked_netto)如sumCheckedNetto所示,施工现场内部连接成本单位cu on site.id=cu.constructionsite内部连接成本单位位置pos.costunit\u id=cu.id内部连接公司com on pos.company\u id=com.id,其中com.id=?group by site.id 2011-05-19 10:42:50159信息字符串类型:203-无法从结果集中读取列值:名称;未找到列“name”。您执行的查询包括“com.name”,但不是您通过java执行的查询。我不确定这是否是问题所在,但您为什么在所有参数前加上site.*前缀?我尝试了一个简单的查询,如select site.name from constructionsite site
,我得到了预期的结果集,没有错误。我明白了。试着一步一步地建立你想要的查询,看看哪里出了问题好啊请不要忘记回答你的问题,如果你有解决办法,这就是事情的发展。祝你好运。我想回答我自己的问题,但“计算机说没有…”我必须等待8个小时,直到我可以发布答案:D问题是别名constructionSiteName
如果我离开它-一切正常问题是什么?我在sqlplus上运行它时遇到了类似的错误,但在java的hibernate查询中没有。“不知道为什么”没有帮助,答案需要澄清。
2011-05-19 10:42:50,159 INFO StringType:203 - could not read column value from result set: name; Column 'name' not found.