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

时间:2011-12-09 00:48:03

标签: java hibernate spring stored-procedures map

我已经使用Spring& amp; Hibernate over MySQL。 我有一个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);

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

我能做的最好的方法就是向你展示它的外观(Map)toString() 这是:

  

{#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}

2 个答案:

答案 0 :(得分:3)

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

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

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

第二个键的值是整数;它是零,因为你做了一个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;

答案 1 :(得分:0)

由于您使用的是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>>() {});

即使这个问题长期存在,我也希望能有所帮助:)