Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate本机SQL查询错误_Java_Mysql_Sql_Hibernate - Fatal编程技术网

Java hibernate本机SQL查询错误

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

我想在hibernate 3.5中执行本机sql查询

我使用MySQL5作为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)
我的查询(直接在服务器上执行时工作正常):

以下是如何在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.