Как получить набор результатов в коде Java, из хранимой процедуры в PLSQL
Я использую шаблон MVC У меня есть две таблицы: сотрудник и адрес
скажем, сотрудник как
-------------------
Id | Name | DeptId
-------------------
101 | Jake | 501
102 | Donald | 502
и у меня есть один стол отдела, как
-----------------------------
DeptId | Name | Description
-----------------------------
501 | IT | software assistance
502 | HR | Human resources
Теперь, так как я использую MVC, эти таблицы отображаются на классы, такие как
@Table(name="Employee")
Class Employee{
@Id
@Column(name="Id")
private Long id;
@Column(name="Name")
private String name;
@Column(name="DeptId")
private Long deptId;
@ManyToOne
@JoinColumn(name="DeptId", referencedColumnName="id", insertable=false,updatable=false)
private Department dept;
//getters and setters go here
}
и другой класс отдела (сопоставленный с таблицей отдела)
@Table(name="Department")
Class Department{
@Id
@Column(name="Id")
private Long id;
@Column(name="Name")
private String name;
@Column(name="Description")
private String description;
//getters and setters go here
}
обратите внимание, что класс Employee имеет ссылку на объект класса Department. Эти аннотации @ManyToOne и @JoinColumn помогают нам автоматически извлекать соответствующий объект отдела вместе с объектом сотрудника.
Это легко с запросами непосредственно в коде, но как это сделать, если я должен использовать только процедуры или функции в моем коде, я пробовал разные методы, но это не помогает
Иногда я получаю ошибку что-то вроде Cannot return resultset from a stored procedure in oracle 10g
Может кто-нибудь, пожалуйста, уточнить. Также я должен использовать JNDI
Могу ли я получить свой результат из процедуры / функции таким образом, чтобы он мне возвращал List<Employee>
(не необработанный набор результатов, который я сам должен разбирать на объекты) . Это должно быть возможно с помощью спящего режима нет?
Спасибо
2 ответа
Ваш PLSQL должен вернуть курсор ref.
JPA 2.1 поддерживает отображение курсоров CallableStatement на сущности. Смотрите этот ответ.
Я пишу псевдокод (не рабочий пример). Но это должно решить вашу проблему.
оракул
CREATE OR REPLACE PROCEDURE getEmployees(deptName varchar(20))
BEGIN
SELECT * FROM Employee where DeptId in ( select DeptId from Department where Name =deptName );
END;
/
зимовать
Query query = session.createSQLQuery(
"CALL GetStocks(:getEmployees)")
.addEntity(Employee.class)
.setParameter("deptName", "Production");
List result = query.list();
for(int i=0; i<result.size(); i++){
Employee emp = (Employee)result.get(i);
System.out.println(emp.toString());
}