5

休止状態 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>

しかし、なぜ次のエラーが発生するのですか? それは私のクエリをに変換しています

dept1 .**deptId を deptId1_0_ として、**dept1.**バージョンを version1_0_ として、**dept1.**deptName を deptName1_0_ として、**dept2.**deptId を deptId1_1_ として、**dept2.**バージョンを version1_1_ として、* を選択します。 *dept2.**deptName as deptName1_1_ **FROM 部門 d1、部門 d2 WHERE d1.deptId = d2.deptId.

Hibernate: 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
4

2 に答える 2

3

そのはず

 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。複数のエンティティを返す)に惑わされた場合は、そこにバグがあります(HHH-2976)。気軽に投票してください。

于 2010-12-28T19:42:05.973 に答える
1

ORA-XXX コードで Google を試してください。http://www.dba-oracle.com/t_ora_00904_string_invalid_identifier.htmから

質問: SQL ステートメントを実行していますが、SQL*Plus エラー ORA-00904 無効な識別子が発生します。

回答: ORA-00904 が発生した場合、有効な列名が欠落しているか、入力された名前が無効であるため、有効な列名を入力する必要があります。最も一般的な「無効な識別子」は、select ステートメントで無効なエイリアスを参照しているときに発生します。Oracle ドキュメントでは、ORA-00904 エラーについて次のように指摘されています。

于 2010-12-28T19:19:32.550 に答える