Java 弹簧&x27;的存储过程,解析结果映射

Java 弹簧&x27;的存储过程,解析结果映射,java,hibernate,spring,stored-procedures,map,Java,Hibernate,Spring,Stored Procedures,Map,我已经在MySQL上安装了Spring和Hibernate。 我想调用一个MySQL存储过程。 该过程接受2个浮点参数,并返回一个包含3个字段的结果集。整数,整数,浮点 我创建了一个扩展spring的StoredProcess的类。 这是执行函数: public Map execute(float longitude, float latiude) { Map inparams = new HashMap(2); inparams.put("longitude", (float) longitu

我已经在MySQL上安装了Spring和Hibernate。 我想调用一个MySQL存储过程。 该过程接受2个浮点参数,并返回一个包含3个字段的结果集。整数,整数,浮点

我创建了一个扩展spring的StoredProcess的类。 这是执行函数:

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);
问题是我不知道如何解析映射结果。 当我调试时,我看到所有的结果集都在那里,但是它以一种奇怪的方式排列,我不知道如何提取字段

为了向您展示它的外观,我所能做的就是为您提供out(Map)的toString() 这是:

{#结果集-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可以很容易地告诉我

在我看来,它就像一张地图。键是“#结果集-1”和“#更新计数-1”

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

第二个键的值是一个整数;它是零,因为你做了选择

因此,为了解释清楚,下面是如何提取结果(对于最初的编码错误,很抱歉):

//Foo是封装每行的未知对象。
列表结果=新建ArrayList();
Map rows=(Map)out.get(“#result-set-1”);
用于(地图行:行){
int id=row.get(“id”);
int out1=行获取(“out1”);
双距离=行获取(“距离”);
添加(新的Foo(id,out1,distance));
}
返回结果;

因为您使用的是Spring,所以可以使用Jackson ObjectMapper。 这比第一个答案更简单

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

我希望这有助于解决这个问题,即使这个问题存在很长一段时间:)

它没有编译,实际上我不太明白你在for语句中做什么,这是什么?“地图行:出去,去……”对不起,那个时候雾太大了。我认为这是正确的。其想法是从结果映射中获取行列表,并迭代其映射集合。这些话是正确的;密码是错的。六年前我回答这个问题时,它没有错。我在IDE和调试器中运行了代码!如果API改变了,那不是我的错。去查查乔恩·斯基特的旧答案,告诉他什么时候错了。
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>>() {});