2016-12-15 20 views
0

Hibernateを使用してOracleストアドプロシージャを実行しようとしました。これは生産用ではなく、私が追求しているJavaソース解析プロジェクト用です。簡単に言えば、Oracle Stored Procから値を返すことはできません。HibernateでOracleストアドプロシージャを実行する

私はSO、Hibernateコミュニティ/ドキュメンテーション(ネイティブSQLの章)のリンクからすべての関連リンクを検索して読んでいますが、何らかの形でそれらを動作させることができませんでした。私の出典は以下のとおりです。関連する部分だけを含めています。

マイエンティティクラス。 PL/SQL OUTパラメータの最初のパラメータを予約しました。

Login.java

@NamedNativeQuery(
     name = "getLoginDet", 
     query = "call GET_LOGIN_DET(?,:userId)", 
     resultClass = Login.class) 
@Entity 
@Table(name = "T_LOGIN_DET") 
public class Login { 

オラクルPROCストアド:GET_LOGIN_DET.sql。最初のパラメータは、Hibernateスペック

create or replace PROCEDURE GET_LOGIN_DET(listLogin OUT SYS_REFCURSOR,userId IN VARCHAR2) 
AS 
BEGIN 
OPEN listLogin FOR 
     SELECT * 
     FROM T_LOGIN_DET 
     WHERE USER_ID = userId; 
    END GET_LOGIN_DET; 

マイDAOクラスごとにOUT REFCURSORです:私は最初のを無視して、唯一の名前付きパラメータを結合していますか?名前付きクエリで

Session session = sessionFactory.openSession(); 
List results = session.getNamedQuery("getLoginDet").setParameter("userId", u.getUserId()).list(); 

私にHibernateコンフィグ

<bean id="mysessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.cogn.gto.sea.employee.entity.Employee</value> 
      <value>com.cogn.gto.sea.employee.entity.Department</value> 
      <value>com.cogn.gto.sea.login.entity.User</value> 
      <value>com.cogn.gto.sea.login.entity.Login</value> 
     </list> 
    </property> 

    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 
      <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

しかし、私はいつも

休止QueryException /ジャワのSQLExceptionで終わる
Expected positional parameter count: 1, actual parameters: [] [{call GET_LOGIN_DET(?,:userId)}] 

私は無駄に{? = call GET_LOGIN_DET(:userId)}call GET_LOGIN_DET(?,:userId)のバリエーションを試してみました。私の要件は、私がリストしたプロシージャを呼び出し、その結果をDAOクラスに戻すことです。誰かが私をここに逃しているものに導くことはできますか?

答えて

0

私はあなたが間違ってストアドプロシージャ(中括弧が欠落している)への呼び出しを宣言していると信じて、これを試してみてください。

@NamedNativeQuery(
     name = "getLoginDet", 
     query = "{call GET_LOGIN_DET(?,:userId)}", 
     resultClass = Login.class 
     hints = {@QueryHint(name = "org.hibernate.callable", value = "true")}) 
@Entity 
@Table(name = "T_LOGIN_DET") 
public class Login { 
+0

これは完璧に動作します。キーはQueryHintで、2つのパラメータが必要です。ありがとうございました。 – user2795418

関連する問題