2016-10-27 48 views
0

私はこの後にSpring Data JPAを使用してストアドプロシージャを呼び出すためにexampleを呼び出しています。アイデアは、エンティティを作成し、このような名前付きストアドプロシージャを定義することです。Springデータでストアドプロシージャを呼び出すときに配列を渡す方法JPA

@Entity 
@Table(name = "TRFTABLE") 
@NamedStoredProcedureQuery(
     name = "processFmTrf", 
     procedureName = "FM_TRF_UTIL.process_fm_trf", 
     parameters = { 
       @StoredProcedureParameter(mode = ParameterMode.IN, name = "i_trf_list", type = String.class), 
       @StoredProcedureParameter(mode = ParameterMode.IN, name = "i_source_system", type = String.class) 
     } 
) 
public class TrfTable implements Serializable{ 
} 

プリミティブ型の入力パラメータではかなり簡単です。 String.class。しかし、私の格納されたprocの入力の1つは配列です。私は次のようにCallableStatementのを使用してストアドプロシージャを呼び出すことで、配列を処理する方法を知っている:

Connection con = getConnection(); 
    OracleConnection oraCon = con.unwrap(OracleConnection.class); 
    // fileArray predefined. 
    Array array = oraCon.createARRAY("VARCHAR2_TAB_T", fileArray); 
    CallableStatement stmt = con.prepareCall("{call FILE_TRANSFER_AUDIT_UTIL.update_file_queue_id(?,?,?,?,?,?)}"); 
    stmt.setArray(1, array); 

DB接続は、ストアドプロシージャへの配列を渡すために確立されなければならないように見えます。どのように私はエンティティクラスのためのNamedStoredProcedureを使用してこれを達成するのですか?

答えて

0

データベース接続が必要なため、NamedStoredProcedureQueryは配列渡しには機能しません。私がしたことは、entitymanagerからセッションを作成し、doWorkメソッドの配列を使ってストアドプロシージャを呼び出すことです:

EntityManager em = Persistence.createEntityManagerFactory("DEV").createEntityManager(); 
    Session session = em.unwrap(Session.class); 
    final String[] trfArray = trfs.toArray(new String[trfs.size()]); 
    final String src = source; 

    session.doWork(new Work(){ 
     public void execute(Connection conn) throws SQLException { 
      CallableStatement stmt = null;    
      OracleConnection oraCon = conn.unwrap(OracleConnection.class); 
      Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray); 
      stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}"); 
      stmt.registerOutParameter(1, Types.INTEGER); 
      stmt.setArray(2, array); 
      stmt.setString(3, src); 
      stmt.execute(); 
      returnVal = stmt.getInt(1); 
     } 
    }); 
関連する問題