Spring的存储过程,解析结果Map

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring的存储过程,解析结果Map相关的知识,希望对你有一定的参考价值。

我已经通过mysql设置了Spring和Hibernate。我有一个MySQL存储过程我想打电话。该过程采用2个浮点参数,并返回包含3个字段的结果集。整型,整数,浮点数。

我创建了一个扩展spring的StoredProcedure的类。这是执行功能:

public Map execute(float longitude, float latiude) {
Map inparams = new HashMap(2);
inparams.put("longitude", (float) longitude);
inparams.put("latitude", (float) latiude);
Map out = execute(inparams);

问题是我不知道如何解析地图结果。当我调试时,我看到所有的结果集都在那里,但它以一种奇怪的方式排列,我不知道如何提取字段。

我能做的最好的方法是告诉你它的外观,就是给你一个toString()out(Map)这里是:

{#result-set-1 = [{id = 4,out1 = 100,距离= 40.9},{id = 5,out1 = 100,距离= 47​​.7},{id = 6,out1 = 100,距离= 22.3} ,{id = 7,out1 = 100,距离= 27.4},{id = 8,out1 = 100,距离= 22.1},{id = 9,out1 = 100,距离= 18.3},{id = 10,out1 = 100,距离= 20.1},{id = 11,out1 = 100,距离= 28.6},{id = 12,out1 = 100,距离= 23.1}],#update-count-1 = 0}

答案

我会在调试器中查看类型是什么; IntelliJ可以很容易地告诉我这一点。

对我来说,它看起来像是Map<String, Object>。键是“#result-set-1”和“#update-count-1”。

第一个键的值是一个地图列表,每行返回一个地图。键是列名,值是返回值。

第二个键的值是Integer;它是零,因为你做了一个SELECT。

因此,为了拼写它,这里是如何提取结果(抱歉初始编码错误):

// Foo is some unknown object that encapsulates each row.
List<Foo> results = new ArrayList<Foo>();
Map<String, Object> rows = (Map<String, Object>) out.get("#result-set-1");
for (Map row : rows) {
    int id = row.get("id");
    int out1 = row.get("out1");
    double distance = row.get("distance");
    results.add(new Foo(id, out1, distance));
}
return results;
另一答案

由于您使用的是Spring,因此可以使用Jackson ObjectMapper。它比第一个答案更简单。

class Foo {
  private int id;
  private int out1;
  private double distance;
  // getters and setters
}
ObjectMapper objectMapper = new ObjectMapper();
List<Foo> list = objectMapper.convertValue(execute.get("#result-set-1"), new TypeReference<List<Foo>>() {});

我希望即使这个问题很长时间开放也有帮助:)

以上是关于Spring的存储过程,解析结果Map的主要内容,如果未能解决你的问题,请参考以下文章

spring整合mybatis时运行测试代码报错,是怎么回事?

mybatis源码解析

Spring的存储过程-从过程返回的结果总是空的

如何在 spring 中使用 SimpleJDBCCall 获取存储过程的结果以及两个结果表?

Spring懒加载机制

Spring Boot进阶系列二