如何从 Java 和 JPA 调用存储过程

新手上路,请多包涵

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

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

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

还有什么将是调用此存储过程的 sql 语句。我以前从未使用过存储过程,我正在努力解决这个问题。谷歌没有太大帮助。

这是存储过程:

 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 名称或结果类详细信息

原文由 user431514 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
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");

请参阅 此处 的详细示例。

原文由 Pau Kiat Wee 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题