一尘不染

从Java / JPA调用存储过程

java

我正在编写一个简单的Web应用程序以调用存储过程并检索一些数据。它是一个非常简单的应用程序,可以与客户的数据库进行交互。我们传递员工ID和公司ID,存储过程将返回员工详细信息。

Web应用程序无法更新/删除数据,并且正在使用SQL Server。

我正在Jboss AS中部署Web应用程序。我应该使用JPA访问存储过程还是CallableStatement。在这种情况下使用JPA的任何优势。

调用该存储过程的sql语句也将是什么。我以前从未使用过存储过程,因此我为此感到吃力。Google并没有太大帮助。

这是存储过程:

CREATE procedure getEmployeeDetails (@employeeId int, @companyId int)
as
begin
    select firstName, 
           lastName, 
           gender, 
           address
      from employee et
     where et.employeeId = @employeeId
       and et.companyId = @companyId
end

更新:

对于任何其他使用JPA调用存储过程有问题的人。

Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
                                   EmployeeDetails.class)           
                                   .setParameter(1, employeeId)
                                   .setParameter(2, companyId);

List<EmployeeDetails> result = query.getResultList();

我注意到的事情:

  1. 参数名称对我不起作用,因此请尝试使用参数索引。
  2. 正确的SQL语句,{call sp_name(?,?)}而不是 call sp_name(?,?)
  3. 如果存储过程正在返回结果集,即使你只知道一行,也getSingleResult不会起作用
  4. 传递resultSetMapping名称或结果类详细信息

阅读 717

收藏
2020-03-11

共1个答案

一尘不染

JPA 2.1现在支持存储过程,请在此处阅读Java文档。

例:

StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("sales_tax");
// set parameters
storedProcedure.registerStoredProcedureParameter("subtotal", Double.class, ParameterMode.IN);
storedProcedure.registerStoredProcedureParameter("tax", Double.class, ParameterMode.OUT);
storedProcedure.setParameter("subtotal", 1f);
// execute SP
storedProcedure.execute();
// get result
Double tax = (Double)storedProcedure.getOutputParameterValue("tax");
2020-03-11