spring data Jpa 调用存储过程返回多个out参数
标注Entity
@Entity
@Table(name="SY_USER")
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name="pd_ka_strreportscanx",procedureName="PD_KA_STRREPORTSCANX"
,parameters={@StoredProcedureParameter(mode=ParameterMode.IN,name="i_send_no",type=String.class)
,@StoredProcedureParameter(mode=ParameterMode.IN,name="i_send_qty",type=String.class),
@StoredProcedureParameter(mode=ParameterMode.OUT,name="o_str_auto",type=String.class),
@StoredProcedureParameter(mode=ParameterMode.OUT,name="o_test_auto",type=String.class),
@StoredProcedureParameter(mode=ParameterMode.OUT,name="o_return",type=String.class)
})
})
public class Users{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="USER_NO")
private String userNo;//主键
@Column(name="USER_ID")
private String userId;//用户id
@Column(name="PASSWORD")
private String password;//用户密码
@Column(name="USER_DESC")
private String userDesc;//用户名称
@Column(name="FACTORY")
private String factory;//用户厂别
@Column(name="INV_FLAG")
private String invFlag;//是否停用
public String getUserDesc() {
return userDesc;
}
public void setUserDesc(String userDesc) {
this.userDesc = userDesc;
}
public String getFactory() {
return factory;
}
public void setFactory(String factory) {
this.factory = factory;
}
public String getInvFlag() {
return invFlag;
}
public void setInvFlag(String invFlag) {
this.invFlag = invFlag;
}
public String getUserNo() {
return userNo;
}
public void setUserNo(String userNo) {
this.userNo = userNo;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
随便找一个entity就可以了如果有多个存储过程,可以用@NamedStoredProcedureQueries就像我上面一样.如果只有1个存储过程,可以用@NamedStoredProcedureQuery代替@NamedStoredProcedureQueries.
@StoredProcedureParameter 是用来标注存储过程的参数的..没啥特别的.只是要注意name和数据库里的参数名字一样.
@NamedStoredProcedureQuery里面procedureName 也要与数据库中存储过程的名字一样.而name可以自己取值,与数据库没有关系
调用存储过程
public String saveQuarantine(HttpServletRequest request,String send_no,String send_qty) throws Exception{
String o_return=null;
String o_str_auto=null;
String o_test_auto=null;
try {
/* o_return=usersService.saveQuarantine(send_no, send_qty);*/
//调用存储过程pd_ka_strreportscanx(此名称并不是数据库中名称由Users类中定义的)
StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("pd_ka_strreportscanx");
store.setParameter("i_send_no", send_no);
store.setParameter("i_send_qty", send_qty);
store.execute();
o_str_auto=(String) store.getOutputParameterValue("o_str_auto");
o_test_auto=(String) store.getOutputParameterValue("o_test_auto");
o_return=(String) store.getOutputParameterValue("o_return");
System.out.println(""+o_return);
} catch (Exception e) {
request.setAttribute(LoggerUtils.LOGGER_RETURN,"保存"+send_no+"待檢材料收貨失败!");
}
if(o_return!=null){
request.setAttribute(LoggerUtils.LOGGER_RETURN,"待檢材料收貨保存成功,正式單號:"+o_str_auto+"測試單號:"+o_test_auto);
o_return="待檢材料收貨保存成功,正式單號:"+o_str_auto+"測試單號:"+o_test_auto;
}
return o_return;
}
}
通过getOutputParameterValue就可以获取你需要的output参数了。