如何从plsql中的存储过程获取java代码中的结果集

时间:2016-02-21 02:18:41

标签: java oracle jpa stored-procedures 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>(不是我自己必须整理成对象的原始结果集)。应该可以使用hibernate no?

谢谢

2 个答案:

答案 0 :(得分:1)

您的PLSQL需要返回ref cursor

JPA 2.1支持将CallableStatement游标映射到实体。请参阅此answer

答案 1 :(得分:-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;
/

<强>休眠

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