Hibernate 原生 SQL 错误
Posted
技术标签:
【中文标题】Hibernate 原生 SQL 错误【英文标题】:Hibernate native SQL error 【发布时间】:2010-12-28 19:15:31 【问题描述】:我正在尝试使用 hibernate 3.3.2.GA 执行 sql 本机查询。
我有以下问题。
session.createSQLQuery("SELECT dept1.*, dept2.* FROM Dept d1, Dept d2 WHERE d1.deptId = d2.deptId").
addEntity("dept1",com.test.pojo.Dept.class).
addEntity("dept2",com.test.pojo.Dept.class).
list();
Dept 类的映射文件是
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.test.pojo.Dept">
<id column="deptId" name="deptId" type="long">
<generator class="native"/>
</id>
<version name="version" access="field" column="version"></version>
<property name="deptName" type="string" column="deptName"/>
<set name="emps" cascade="all" inverse="true">
<key column="deptId"></key>
<one-to-many class="com.test.pojo.Emp"/>
</set>
</class>
</hibernate-mapping>
但是为什么我得到以下错误?它正在将我的查询转换为
SELECT dept1.**deptId as deptId1_0_, **dept1.**version as version1_0_,**dept1.**deptName 作为 deptName1_0_,**dept2.**deptId 作为 deptId1_1_, **dept2.**version as version1_1_, **dept2.**deptName as deptName1_1_ **FROM Dept d1, Dept d2 WHERE d1.deptId = d2.deptId.
休眠:选择 dept1.deptId 作为 deptId1_0_,dept1.version 作为 version1_0_,dept1.deptName 作为 deptName1_0_,dept2.deptId 作为 deptId1_1_,dept2.version 作为 version1_1_,dept2.deptName 作为 deptName1_1_ FROM Dept d1, Dept d2 WHERE d1.deptId = d2.deptId 20:43:41,109 WARN JDBCExceptionReporter:100 - SQL 错误:904, SQLState: 42000 20:43:41,109 错误 JDBCExceptionReporter:101 - ORA-00904: "DEPT2"."DEPTNAME": 标识符无效
Exception in thread "main" 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)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1723)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)
at com.test.test.Test1.main(Test1.java:96)
Caused by: java.sql.SQLException: ORA-00904: "DEPT2"."DEPTNAME": invalid identifier
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:590)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1973)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:850)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2599)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2963)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:658)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:584)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
... 7 more
【问题讨论】:
【参考方案1】:应该是
session.createSQLQuery(
"SELECT dept1.*, dept2.* FROM Dept dept1, Dept dept2 WHERE dept1.deptId = dept2.deptId")
.addEntity("dept1",com.test.pojo.Dept.class)
.addEntity("dept2",com.test.pojo.Dept.class)
.list();
如果您被文档 (18.1.4. Returning multiple entities) 误导了,那里有一个错误 (HHH-2976),请随时为它投票。
【讨论】:
我觉得d1.deptId和d2.deptID也应该修改为dept* ;-)【参考方案2】:使用 ORA-XXX 代码试用 Google。来自http://www.dba-oracle.com/t_ora_00904_string_invalid_identifier.htm
问题:我正在运行 SQL 语句,我得到一个 SQL*Plus 错误 ORA-00904 无效的标识符。
答案:当 ORA-00904 发生时,您 必须输入一个有效的列名,因为它 要么丢失,要么输入的那个 是无效的。 “无效标识符” 最常见的发生在你 在 a 中引用无效别名 选择语句。甲骨文文档 请注意 ORA-00904 错误:
【讨论】:
不,问题是 Hibernate 将查询转换为无效。我指的是休眠参考文档。以上是关于Hibernate 原生 SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章