Как получить набор результатов в коде 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());
}
Другие вопросы по тегам