java - 如何在 PL/SQL 中的 Map 中返回结果?
问题描述
我想从存储过程返回一个映射到我的 Java 代码。PL/SQL 的结果采用 Map 格式,如Map<key, List>。是否可以返回这样的数据?
我已经在一个字符串中返回了整个数据,并且从 java 类中我使用了拆分逻辑来拆分数据并将它们保存在适当的字段中。像一个例子:
String[] lines = resultString.split(System.lineSeparator()); List<MessageVO> resultPerList = new ArrayList<>();
for (String line : lines) {
MessageVO message = new MessageVO();
String[] fieldArray = line.split(":", 0);
String field= fieldArray[0];
message.setField(field);
resultPerList.add(message);
}
解决方案
如果您喜欢 PL/SQL 并且结果列表很小,那么您的解决方案(在 SQL 中构建数据)很好。在 PL/SQL 中,您可以利用listagg 语句
这是功能示例:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class sasafd {
public static void main(String[] args) {
String resultString = "key1:valuea:valueb:valuec"
+ System.lineSeparator()
+ "key2:valuea:valueb:valuec";
String[] lines = resultString.split(System.lineSeparator());
Map<String, List<String>> resultMap = new HashMap<String, List<String>>();
for (String line : lines) {
String[] fieldArray = line.split(":", 0);
for (String value : fieldArray)
if (resultMap.containsKey(fieldArray[0])) {
resultMap.get(fieldArray[0]).add(value);
} else {
resultMap.put(fieldArray[0], new LinkedList<String>());
}
}
System.out.println(convertWithStream(resultMap));
}
public static String convertWithStream(Map<String, List<String>> map) {
String mapAsString = map.keySet().stream().map(key -> key + "=" + map.get(key))
.collect(Collectors.joining(", ", "{", "}"));
return mapAsString;
}
}
输出:
{key1=[valuea, valueb, valuec], key2=[valuea, valueb, valuec]}
如果您喜欢更多表格数据,则可以从 DB 中使用此代码中的想法:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class sasafd {
public static void main(String[] args) {
String[][] resultSet =
{{"key1","valuea"},{"key1","valueb"},{"key1","valuec"}
,{"key2","valuea"},{"key2","valueb"},{"key2","valuec"}};
Map<String, List<String>> resultMap = new HashMap<String, List<String>>();
for (String[] line : resultSet) {
if (resultMap.containsKey(line[0])) {
resultMap.get(line[0]).add(line[1]);
} else {
resultMap.put(line[0], new LinkedList<String>());
resultMap.get(line[0]).add(line[1]);
}
}
System.out.println(convertWithStream(resultMap));
}
public static String convertWithStream(Map<String, List<String>> map) {
String mapAsString = map.keySet().stream().map(key -> key + "=" + map.get(key))
.collect(Collectors.joining(", ", "{", "}"));
return mapAsString;
}
}
你也可以试试 ORM。如果您不喜欢 PL/SQL 中的冒号分隔文本,您也可以使用 XML、JSON、...
JDBC 不支持 Map 结果。
推荐阅读
- c# - 会话不断被锁定
- flutter - 如何在 ListTile 中保存按钮状态并使按钮异步?
- image - Vaadin 拒绝在 HorizontalLayout 中对齐图像
- c - 为什么我不能使用带有字符指针变量的 scanf() 或 gets() strcat() strcpy() 等字符串函数?
- node.js - Heroku Node.js 应用程序不断崩溃并重新启动
- python - python:模拟类变量的多重继承
- reactjs - 在ajax调用后反应更新dom模板
- javascript - 基于用户输入的 JavaScript 字体颜色变化
- python - Pandas:如果无序,则跨列对 DataFrame 单元格进行排序
- java - JDK11 HttpClient 双向 tls