如何在Java代码中从PL/SQL存储过程中获取结果集

6
我正在使用MVC模式 我有两个表:Employee和Address
比如说, Employee表像这样:
-------------------
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注释可以帮助我们自动检索与员工对象对应的部门对象。
在代码中直接查询很容易,但如果我只想在我的代码中使用存储过程或函数,该怎么做呢?我尝试了不同的方法,但似乎没有帮助。
有时候我会收到错误信息,例如“无法从Oracle 10g中的存储过程返回结果集”。
请问有人能澄清一下吗?另外,我必须使用JNDI。
我能否以一种方式从过程/函数中获取结果,使其以List<Employee>的形式返回(而不是我自己将结果集排序为对象)?使用Hibernate应该是可行的,对吧?
谢谢。
2个回答

1
你的PLSQL需要返回一个ref cursor
JPA 2.1支持将CallableStatement out cursors映射到实体。请参见此answer

-1

我正在编写伪代码(不是实际的工作示例),但它应该可以解决你的问题。

Oracle

CREATE OR REPLACE PROCEDURE getEmployees(deptName varchar(20))
BEGIN
   SELECT * FROM Employee where DeptId in ( select DeptId from Department where Name =deptName );

END;
/

Hibernate

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());
}

抱歉!我需要选择员工,而不是部门!每个员工都映射到一个部门,因为有deptId列。我想要在员工的“dept”字段中得到相应的Department对象。如果在Java代码中使用查询,这很简单,但在存储过程中就不那么容易了。 - Sarabjeet
修改了伪代码。你需要尝试一下。 - Nilesh Deshpande

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接