您可以定义多种 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();
}
在这种情况下,您不必为输出定义特殊的 oracle 集合类型,只需ref cursor
在 PL/SQL 中返回即可。