複数の Oracle オブジェクト タイプを定義できます。Oracle オブジェクトの場合、それらは にマップされjava.sql.Struct
ます。コレクションの場合(私が理解している限り、あなたが参照しているテーブルタイプのように)、それらはにマップされjava.sql.Array
ます。out パラメータを として登録するだけjava.sql.Array
です。古い oracle JDBC ドライバー (10g) の場合は、型 (スキーマを含む) への完全な参照を使用することを忘れないでください。そうしないと、「無効な型」などのエラーが発生する可能性があります。
例:
stmt.registerOutParameter(4, Types.ARRAY, "SCHEMA.TABLE_TYPE");
stmt.execute();
Array array = stmt.getArray(4);
このようなコードがたくさんある場合は、eclipselink のアプローチを利用できます。
@Entity
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(
name = "Company.getCompanies",
procedureName = "SQL_PACKAGE.GET_COMPANIES",
parameters = {
@StoredProcedureParameter(queryParameter = "p_filter", direction = Direction.IN),
@StoredProcedureParameter(queryParameter = "p_result", direction = Direction.OUT_CURSOR),
},
resultClass = Company.class)
})
public class Company {
@Id
@Column(name = "COMPANY_NO")
private Long companyNo;
@Column(name = "COMPANY_NAME")
private String companyName;
public Long getCompanyNo() {
return companyNo;
}
public String getCompanyName() {
return companyName;
}
}
そして、DAO でそのようなエンティティを使用します。
@Transactional(readOnly = true)
public List<Company> getCompanies(String filter) {
EntityManager em = entityManagerProvider.get();
Query query = em.createNamedQuery("Company.getCompanies");
query.setParameter("p_filter", filter);
return query.getResultList();
}
このようなシナリオでは、出力用に特別なオラクル コレクション タイプを定義する必要はなくref cursor
、PL/SQL で返すだけです。