Arrays 使用Spring数据JPA调用存储过程时如何传入数组
下面我将使用Spring数据JPA调用存储过程。其思想是创建一个实体,并像这样定义NamedStoredProcessArrays 使用Spring数据JPA调用存储过程时如何传入数组,arrays,oracle,hibernate,stored-procedures,spring-data-jpa,Arrays,Oracle,Hibernate,Stored Procedures,Spring Data Jpa,下面我将使用Spring数据JPA调用存储过程。其思想是创建一个实体,并像这样定义NamedStoredProcess @Entity @Table(name = "TRFTABLE") @NamedStoredProcedureQuery( name = "processFmTrf", procedureName = "FM_TRF_UTIL.process_fm_trf", parameters = { @St
@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)的输入参数,这非常简单。但是,我的存储过程的一个输入是数组。我知道如何通过使用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 for me实体类完成此操作?NamedStoredProcedure不适用于传入数组,因为它需要数据库连接。我所做的是从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);
}
});
这应该起作用:
Array Array=oraCon.createARRAYVARCHAR2\u选项卡\u T,文件数组; StoredProcedureQuery=entityManager.CreateNamedStoredProcedureRequestyProcessFMTRF .setParameteri\u trf\u列表,数组 .setParameteri_source_system,sourceValue;
Array Array=oraCon.createARRAYVARCHAR2\u选项卡,trfArray;发送一些异常。无法将数组强制转换为数组。使用JPARepository如何