请问hibernate中怎么获取存储过程返回的值?

zz_75 2006-08-11 03:13:16
存储过程是这样调用的
tx = session.beginTransaction();
PreparedStatement st = session.connection().prepareStatement("{call Register(?)}");
st.execute();
tx.commit();

“?”为要返回的值是int型,
我怎么能获取这个值
...全文
605 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
majianglin 2006-08-12
  • 打赏
  • 举报
回复
我调用存储过程和你的方法不一样,Sorry,我的代码帖出来给你,用的是Hibernate3.05
实际上我这个方法是用的JDBC的方法调用的

=============================================================
package com.dc.tirip.dis.configuration.dao;

import java.sql.CallableStatement;
import java.sql.SQLException;
import java.sql.Types;

import com.dc.tirip.common.framework.dbconfig.HibernateUtil;
import com.dc.tirip.common.logging.ILogger;



public class DisServiceConfigDao {
/**
* 日志记录
*/
private static ILogger log = ILogger.Factory.getLogger(DisServiceConfigDao.class);

/**
* 获取服务配置,注意参数顺序
*
* @param channelId
* 渠道标识
* @param serviceId
* 服务标识
* @param platformId
* 平台标识
* @param channelType
* 渠道类型
* @param nsrsbh
* 纳税人识别号
* @return
*/
public static DisServiceConfig getDisServiceConfig(String channelId, String serviceId, String platformId,
String channelType, String nsrsbh) {
DisServiceConfig serviceConfig = new DisServiceConfig();
serviceConfig.setChannelId(channelId);
serviceConfig.setServiceId(serviceId);
serviceConfig.setPlatformId(platformId);
serviceConfig.setChannelType(channelType);
serviceConfig.setNsrsbh(nsrsbh);
int returnCode = 101;
CallableStatement cstmt = null;

try {
// 取得Hibernate数据库连接
java.sql.Connection conn = HibernateUtil.currentSession().connection();

// 准备存储过程
cstmt = conn.prepareCall(
"begin :1 := P_XT_GET_SERVICE_CONFIG(:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14); end;");
// "{ ?=call P_XT_GET_SERVICE_CONFIG(?,?,?,?,?,?,?,?,?,?,?,?,?) }");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.registerOutParameter(7, Types.VARCHAR);
cstmt.registerOutParameter(8, Types.VARCHAR);
cstmt.registerOutParameter(9, Types.VARCHAR);
cstmt.registerOutParameter(10, Types.VARCHAR);
cstmt.registerOutParameter(11, Types.VARCHAR);
cstmt.registerOutParameter(12, Types.VARCHAR);
cstmt.registerOutParameter(13, Types.VARCHAR);
cstmt.registerOutParameter(14, Types.INTEGER);
cstmt.setString(2, channelId);
cstmt.setString(3, serviceId);
cstmt.setString(4, platformId);
cstmt.setString(5, channelType);
cstmt.setString(6, nsrsbh);

// 执行存储过程
cstmt.execute();

// 取得输出参数
returnCode = cstmt.getInt(1);
serviceConfig.setIsTransform(cstmt.getString(7));
serviceConfig.setIsVerifyDataLogic(cstmt.getString(8));
serviceConfig.setIsVerifyDataSemantic(cstmt.getString(9));
serviceConfig.setIsVerifyDataCRC(cstmt.getString(10));
serviceConfig.setZipType(cstmt.getString(11));
serviceConfig.setEncryptType(cstmt.getString(12));
serviceConfig.setCodeType(cstmt.getString(13));
serviceConfig.setTransactPriority(new Integer(cstmt.getInt(14)));

} catch (SQLException e) {
log.warn("调用存储过程出错,无法获得配置:", e);
}
finally
{
if(cstmt != null)
{
try
{
cstmt.close();
}
catch(SQLException e)
{
log.warn("调用存储过程出错,无法获得配置:", e);
}
cstmt = null;
}
}


// 设置执行结果
serviceConfig.setReturnCode(returnCode);

if (log.isDebugEnabled()) {
log.debug(serviceConfig.toString());
}
return serviceConfig;
}

public static void main(String[] s) {
String channelId = "S110";
String serviceId = "0";// "SBTY31";
String platformId = "0S00";
String channelType = "J";
String nsrsbh = "0";

DisServiceConfig businessConfig = getDisServiceConfig(channelId, serviceId, platformId, channelType, nsrsbh);
log.debug("businessConfig=" + businessConfig.toString());
}
}
majianglin 2006-08-12
  • 打赏
  • 举报
回复
int returnValue = st.getInt(1);

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧