【问题标题】:hibernate native SQL query errorhibernate原生SQL查询错误
【发布时间】:2011-08-28 16:28:57
【问题描述】:

我想在 hibernate 3.5 中执行原生 sql 查询。

我使用 mysql 5 作为 dbms,在 mysqlworkbench 上测试了查询,我得到了我想要的数据。

所以我在我的 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();

我真的不知道我做错了什么,非常感谢一些帮助。

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.

【问题讨论】:

  • ps:请不要被表名和列名弄糊涂了。 :D
  • 赋值后能不能打印出queryString的实际值
  • 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 从建筑工地站点内部连接 ​​costunit cu on site.id = cu.constructionsite 内部连接 ​​costunit_position pos on pos.costunit_id = cu.id 内部连接公司 com on pos.company_id = com.id where com.id = ?按 site.id 2011-05-19 10:42:50,159 INFO StringType:203 分组 - 无法从结果集中读取列值:名称;未找到列“名称”。
  • 您执行的查询包括“com.name”,但不包括您通过 java 执行的查询。我不确定这是否是问题
  • 为什么要在所有参数前加上 site.* 前缀?

标签: java mysql sql hibernate


【解决方案1】:

请仔细检查表site 有一个名为name 的列。 (注意:MySQL 表名可能区分大小写,具体取决于配置和底层操作系统。)

仔细检查您的应用程序使用的数据库与您从 SQL 客户端执行查询的数据库完全相同。也许你有一个测试和生产环境,有两个不同版本的表site

【讨论】:

  • 我用select site.name from constructionsite site 之类的简单查询尝试了同样的方法,我得到了预期的结果集而没有错误。
  • 我明白了。尝试逐步建立您想要的查询,看看哪里出错了.. :-)
  • 好的。如果您有解决方案,请不要忘记回答您的问题,这就是事情的发展方式。祝你好运。
  • 想回答我自己的问题,但“计算机说不......”我必须等待 8 小时才能发布答案:D 问题是别名 constructionSiteName 如果我离开它 -一切正常
  • 出了什么问题?我在 sqlplus 上运行它时遇到了类似的错误,但在 java 中的休眠查询中却没有。
【解决方案2】:

尝试从 SQL 中删除列别名。我之前遇到过类似的问题,并且为我解决了这个问题。在休眠状态下运行时,本机 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;

【讨论】:

    【解决方案3】:

    与 MySQL-JDBC 有关。 将 [useOldAliasMetadataBehavior=true] 添加到配置文件中的 JDBC url。 来源:http://bugs.mysql.com/bug.php?id=31499

    【讨论】:

      【解决方案4】:

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

      但是,如果我输入 ifnull(site.name),这似乎可行。不知道为什么。

      【讨论】:

      • “不知道为什么”没有帮助,答案需要澄清。
      猜你喜欢
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多