从Java / JPA调用存储过程

从Java / JPA调用存储过程

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

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

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

另外,调用此存储过程的sql语句是什么。我之前从未使用过存储过程,而且我正在努力解决这个问题。谷歌没有多大帮助。

这是存储过程:

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

更新:

对于其他任何使用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名称或结果类详细信息


蛊毒传说
浏览 1353回答 3
3回答

阿晨1998

我正在Jboss AS中部署我的Web应用程序。我应该使用JPA来访问存储过程或CallableStatement。在这种情况下使用JPA的任何优点。JPA并不真正支持它,但它是可行的。我仍然不会这样:使用JPA只是为了在一些bean中映射存储过程调用的结果实在是太过分了,特别是考虑到JPA不适合调用存储过程(语法非常冗长)。因此,我宁愿考虑使用Spring支持JDBC数据访问,也可以考虑使用像MyBatis这样的数据映射器,或者考虑到应用程序的简单性,使用原始JDBC和CallableStatement。实际上,JDBC可能是我的选择。这是一个基本的启动示例:CallableStatement&nbsp;cstmt&nbsp;=&nbsp;con.prepareCall("{call&nbsp;getEmployeeDetails(?,&nbsp;?)}");cstmt.setInt("employeeId",&nbsp;123);cstmt.setInt("companyId",&nbsp;456);ResultSet&nbsp;rs&nbsp;=&nbsp;cstmt.executeQuery();参考JDBC文档:Java SE 6
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
SQL Server