Вы можете определить несколько типов объектов оракула.В случае объектов оракула они отображаются на java.sql.Struct
.В случае коллекций (например, типа таблиц, на которые вы ссылаетесь, насколько я понимаю) они сопоставляются с java.sql.Array
.Просто зарегистрируйте свой выходной параметр как java.sql.Array
.В случае более старых драйверов JDBC oracle (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.