存储过程将多个表返回到spring jdbc模板

Posted

技术标签:

【中文标题】存储过程将多个表返回到spring jdbc模板【英文标题】:Stored Procedure returning multiple tables to spring jdbc template 【发布时间】:2011-05-18 05:47:04 【问题描述】:

我正在使用 JdbcTemplate 从我的 Spring DAO 类中调用一个存储过程。我的问题是,存储过程返回多个表。有没有办法使用 Spring JdbcTemplate 访问多个表。

如果我使用 jdbcTemplate.queryForList(myStoredProc, new Object[]parameters 我只从结果中得到第一个表。

我的数据库是 SQL Server 2005。

除了 jdbcTemplate 之外还有什么方法可以满足我的要求吗?

【问题讨论】:

【参考方案1】:

sinha 引用的解决方案对我不起作用。我能够使用JdbcTemplate#call(CallableStatementCreator, List<SqlParameter>) 解决这个问题。例如:

private static final String sql = "call schema_name.the_stored_procedure(?, ?, ?)";

// The input parameters of the stored procedure
private static final List<SqlParameter> declaredParams = Arrays.asList(
    new SqlParameter("nameOfFirstInputParam", Types.VARCHAR),
    new SqlParameter("nameOfSecondInputParam", Types.VARCHAR),
    new SqlParameter("nameOfThirdInputParam", Types.VARCHAR));

private static final CallableStatementCreatorFactory cscFactory
    = new CallableStatementCreatorFactory(sql, declaredParams);

// The result sets of the stored procedure
private static final List<SqlParameter> returnedParams = Arrays.<SqlParameter>asList(
    new SqlReturnResultSet("nameOfFirstResultSet", SomeRowMapper.INSTANCE),
    new SqlReturnResultSet("nameOfSecondResultSet", SomeOtherRowMapper.INSTANCE));

public static Map<String, Object> call(JdbcTemplate jdbcTemplate,
                                       String param0,
                                       String param1,
                                       String param2) 
  final Map<String, Object> actualParams = new HashMap<>();
  actualParams.put("nameOfFirstInputParam", param0);
  actualParams.put("nameOfSecondInputParam", param1);
  actualParams.put("nameOfThirdInputParam", param2);

  CallableStatementCreator csc = cscFactory.newCallableStatementCreator(actualParams);
  Map<String, Object> results = jdbcTemplate.call(csc, returnedParams);

  // The returned map will including a mapping for each result set.
  //
  // 
  //   "nameOfFirstResultSet" -> List<SomeObject>
  //   "nameOfSecondResultSet" -> List<SomeOtherObject>
  // 
  //
  // For this example, we just return the heterogeneous map.  In practice,
  // it's better to return an object with more type information.  In other
  // words, don't make client code cast the result set lists.  Encapsulate
  // that casting within this method.

  return results;

【讨论】:

谢谢! SqlReturnResultSet 是我要找的。 :) 在单个查询中使用多个选择。这是我需要的查询。谢谢【参考方案2】:

见http://static.springsource.org/spring/docs/2.0.7/reference/jdbc.html#jdbc-StoredProcedure

本节中给出的示例完全适用于存储过程返回多个结果集的情况。虽然这里给出的示例是针对 Oracle 的,但它也应该以同样的方式用于 MS SQL Server。

【讨论】:

我正在使用带有 proc 的 spring StoredProc 来返回标量或仅返回一行结果,但我很好奇如何处理这种情况。如果 proc 返回多行,您知道返回的 Map 的内容是什么吗?它是地图的地图,其中封闭的地图键是行索引?

以上是关于存储过程将多个表返回到spring jdbc模板的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 从存储过程中获取 Oracle 表类型

使用 Spring JPA 调用存储过程

如何将单个结果集从返回多个集的 SQL 存储过程保存到临时表?

Java Spring JDBC Oracle存储过程返回null [重复]

JDBC:Oracle 存储过程返回嵌套表

我可以在 jdbc 中调用一个使用 mysql 返回表的存储过程吗?