Hibernate本地SQL查询错误

4
我希望您能在Hibernate 3.5中执行本地SQL查询。
我使用MySQL 5作为数据库管理系统,在MySQL Workbench中测试了查询并获得了所需的数据。
因此,我在Java代码中创建了一个SQLQuery对象,设置了查询字符串和所需的参数。
执行查询后,我收到了一个异常消息:
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)

我的查询(在服务器上直接执行正常):

select site.name as constructionSiteName, site.id as constructionSiteId, com.name,
        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 = 57
    group by site.id;

以下是我在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();

我真的不知道我做错了什么,非常感谢您的帮助。
提前感谢。
编辑:
由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.

ps:请不要被表格和列名所困扰:D - theFriedC
在赋值后,你能打印出queryString的实际值吗? - Suraj Chandran
2011-05-19 10:42:50,143 调试 SQL:111 - 选择 site.name 作为 constructionSiteName,site.id 作为 constructionSiteId,sum(pos.sum_checked_brutto) 作为 sumCheckedBrutto,sum(pos.sum_checked_netto) 作为 sumCheckedNetto,从 constructionsite site 内连接 costunit cu,on site.id = cu.constructionsite,内连接 costunit_position pos,on pos.costunit_id = cu.id,内连接 company com,on pos.company_id = com.id,where com.id = ?,按 site.id 分组。 2011-05-19 10:42:50,159 信息 StringType:203 - 无法从结果集中读取列值:name;未找到列“name”。 - theFriedC
1
您执行的查询包括“com.name”,但不包括通过Java执行的查询。虽然我不确定这是否是问题。 - Suraj Chandran
你为什么要在所有参数前面加上 site.* 前缀? - netbrain
表格“company”也有一个名为“name”的列。如果我不加前缀,就会出现“模棱两可”的错误:.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'name' in field list is ambiguous - theFriedC
4个回答

0
请仔细检查表格site是否有一个名为name的列。(注意:MySQL表格名称可能依据配置和基础操作系统大小写敏感。)
请确保您的应用程序使用与您在SQL客户端中执行查询时相同的数据库。也许您有两个不同版本的site表,分别用于测试和生产环境。

我尝试使用像 select site.name from constructionsite site 这样的简单查询,预期输出结果集且没有出现错误。 - theFriedC
我明白了。尝试逐步构建您想要的查询,看看哪里出了问题.. :-) - jabal
好的,请不要忘记在您有解决方案时回答问题,这是我们这里的惯例。祝你好运。 - jabal
2
我想回答我的问题,但是“电脑说不行...”我必须等待8个小时才能发布答案:D 问题出在constructionSiteName这个别名上,如果我把它留下来 - 一切都正常工作。 - theFriedC
问题是什么?我遇到了一个类似的错误,在sqlplus上运行时可以正常工作,但在我的Java Hibernate查询中却无法正常工作。 - Tim McJilton
@chris 兄弟,你上面的评论就是解决方案,我也找到了,但问题是什么呢?我的意思是为什么Hibernate不允许这些别名。我在同一张表上进行多个连接时遇到了问题,如果没有别名,它会让我和Hibernate都感到困惑:P 你能帮我一下吗 :) - Khizar

0

尝试从SQL中删除列别名。我之前遇到过类似的问题,这个方法对我有用。不知何故,当在Hibernate上运行本地SQL查询时,会忽略列别名。我不确定为什么会发生这种情况。

您的查询应该是select site.name , site.id , com.name, sum(pos.sum_checked_brutto) , sum(pos.sum_checked_netto) 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 = 57 group by site.id;


0

0

是的,删除别名可以解决问题,但如果您有两个表,每个表都有一个名为name的列,则会出现问题。

但是,如果我放置一个ifnull(site.name),这似乎可以解决问题。不知道为什么。


“不知道为什么”不能帮助,答案需要澄清。 - piyushj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接