【问题标题】:calling stored proc in jdbc template which returns multiple rows在返回多行的 jdbc 模板中调用存储过程
【发布时间】:2020-01-21 06:08:30
【问题描述】:

如果我使用返回多行数据的 Jdbc 模板调用存储过程。例如,存储过程根据某些业务规则返回 200 条记录。如何一次迭代和处理这 1 个,我们可以使用自定义行映射器吗?

在这里我可以为 1 位员工调用它。但需要它作为一个列表。

  SimpleJdbcCall jdbcCall = new 
           SimpleJdbcCall(dataSource).withProcedureName("getEmployeeeRecord");
  SqlParameterSource in = new MapSqlParameterSource().addValue("emp_id", id);
        Map<String, Object> out = jdbcCall.execute(in);
        Employee employee = new Employee();
        employee.setId(id);
        employee.setName((String) out.get("out_name"));
        employee.setAge((Integer) out.get("out_age"));
        return employee ;

【问题讨论】:

  • 据我所知,API 不支持。它只支持单行结果,或参数中的结果集。如果您想处理返回结果集的存储过程,那么您可能应该直接使用JdbcTemplate(但该 API 似乎也暗示它并不真正期望可调用语句返回结果集)。

标签: java stored-procedures jdbc spring-jdbc simplejdbccall


【解决方案1】:

我做了这样的事情:

@PostConstruct
public void init() {
    jdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("name_of_procedure")
            .withCatalogName("catalog_name")
            .withSchemaName("schema_name")
            .declareParameters(
                    new SqlParameter("@NIT", Types.VARCHAR));
}

public List<Student> invocar(Param parameters) {
    jdbcCall.setFunction(false);
    List<Student> listResult = new ArrayList<>();
    MapSqlParameterSource valueParams = new MapSqlParameterSource();
    valueParams.addValue("@NIT", parameters.getNit());
    

    Map<String, Object> resultStoreProcedure = jdbcCall.execute(valueParams);

    List<LinkedCaseInsensitiveMap<String>> linkedCaseInsensitiveMapList = 
    (ArrayList<LinkedCaseInsensitiveMap<String>>) resultStoreProcedure.get("#result- 
     set-1");
    for (LinkedCaseInsensitiveMap<String> linkedCaseInsensitiveMap : 
      linkedCaseInsensitiveMapList) {
        listResult.add(ResumenInversionesSalidaSpTo
                .builder()
                .name(linkedCaseInsensitiveMap.get("name"))
                .lastName(linkedCaseInsensitiveMap.get("last_name"))
                .age(linkedCaseInsensitiveMap.get("age"))
                .nit(linkedCaseInsensitiveMap.get("nit"))
                .build());
    }
    return listResult;
}

它适用于 SQL 服务器数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2012-03-10
    • 2011-01-09
    • 1970-01-01
    • 2018-09-13
    • 2021-03-02
    • 2015-05-28
    相关资源
    最近更新 更多