如何使用hibernate 4.0调用ms sql存储过程

时间:2014-02-05 19:47:47

标签: java sql-server hibernate stored-procedures

我正在使用商店程序 即

CREATE PROCEDURE test 
(
@INPUTPARAM INT,
@OUTPUTPARAM VARCHAR(20)
)
AS
SELECT @OUTPUTPARAM=S.NAME+','+D.NAME
FROM STUDENT S,DEPARTMENT D
WHERE S.DEPTID=D.DEPARTID AND D.DEPARTID=@INPUTPARAM
BEGIN
END

如何使用hibernate从java类中获取参数 请分享代码示例

2 个答案:

答案 0 :(得分:1)

CREATE PROCEDURE test 
(
@INPUTPARAM INT,
@OUTPUTPARAM VARCHAR(20) OUTPUT --<-- You need to use key word "OUTPUT" here
)
AS
BEGIN

  SELECT @OUTPUTPARAM = S.NAME + ',' + D.NAME
  FROM  STUDENT S INNER JOIN DEPARTMENT D
  ON    S.DEPTID = D.DEPARTID         --<-- Use New Syntax of join with On Clause
  WHERE D.DEPARTID = @INPUTPARAM

END

执行程序

DECLARE @Var VARCHAR(20);
EXECUTE dbo.test 
@INPUTPARAM = 1
@OUTPUTPARAM = @Var OUTPUT --<-- use OUTPUT key word here as well

SELECT  @Var

答案 1 :(得分:-1)

唯一的方法是使用em.createNativeQuery并直接与SQL中的DB Server对话。

更新

以下是如何做到的:

//get connection from em
Session session = (Session)em.getDelegate();
Connection conn = session.connection();

//Native SQL
final CallableStatement callStmt = conn.prepareCall("{call your.function(?)}");
callStmt.setLong(1, documentId);
callStmt.execute();

if (callStmt.getMoreResults()) {
   ResultSet resSet = cStmt.getResultSet();
   //Do something good with you result
   resSet.close();
}
callStmt.close();

//Don't know if calling conn.close(); is a good idea. Since the session owns it.

希望有所帮助。

注意:

如果您使用的是JPA 2.0,you can get the session using

Connection conn = em.unwrap(Session.class).connection();

如果您使用的是JPA 2.1,则可以调用存储过程directly

 StoredProcedureQuery query = em.createNamedStoredProcedureQuery("ReadAddressById");
 query.setParameter("P_ADDRESS_ID", 12345);
 List<Address> result = query.getResultList();