Assume we have a stored procedure like this in our database:
USE [YOUR_DATABASE_NAME] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[TestParamOutput] @test_input1 INT, @test_input2 INT, @test_input3 INT, @test_input4 INT, @test_output1 INT OUTPUT, @test_output2 INT OUTPUT, @test_output3 INT OUTPUT, @test_output4 INT OUTPUT AS BEGIN SET NOCOUNT ON; SELECT @test_output1 = @test_input1+@test_input2; SELECT @test_output2 = @test_input3+@test_input4; SELECT @test_output3 = @test_input1*@test_input2; SELECT @test_output4 = @test_input3*@test_input4; END
We can do the following in our service class. Note that the name procedure name, and the parameter names should match.
@PersistenceContext private EntityManager em; public int[] getSPOutput(){ StoredProcedureQuery proc = em.createStoredProcedureQuery("TestParamOutput"); proc.registerStoredProcedureParameter("test_input4", Integer.class, ParameterMode.IN); proc.registerStoredProcedureParameter("test_input1", Integer.class, ParameterMode.IN); proc.registerStoredProcedureParameter("test_input2", Integer.class, ParameterMode.IN); proc.registerStoredProcedureParameter("test_input3", Integer.class, ParameterMode.IN); proc.registerStoredProcedureParameter("test_output4", Integer.class, ParameterMode.OUT); proc.registerStoredProcedureParameter("test_output3", Integer.class, ParameterMode.OUT); proc.registerStoredProcedureParameter("test_output2", Integer.class, ParameterMode.OUT); proc.registerStoredProcedureParameter("test_output1", Integer.class, ParameterMode.OUT); proc.setParameter("test_input1", 1); proc.setParameter("test_input2", 2); proc.setParameter("test_input3", 3); proc.setParameter("test_input4", 4); proc.execute(); return new int[]{(int) proc.getOutputParameterValue("test_output1"), (int) proc.getOutputParameterValue("test_output2"), (int) proc.getOutputParameterValue("test_output3"), (int) proc.getOutputParameterValue("test_output4")}; }