Java如何遍历JSON映射的POJO数组 用Stream拼接SQL查询数据库
实现方案
你的入参是数组结构的JSON,反序列化后直接对应List<自定义POJO>类型,之前尝试的Map.Entry遍历方式不适用这个场景——因为外层没有键值对结构,不需要转Map处理,直接按层级遍历即可。
参考POJO定义(基于你已有的代码补全)
// 可根据实际情况修改类名 public class QueryCondition { private Integer k1; private List<Integer> k2 = new ArrayList<>(); public Integer getK1() { return k1; } public void setK1(Integer k1) { this.k1 = k1; } public List<Integer> getK2() { return k2; } public void setK2(List<Integer> k2) { this.k2 = k2; } }
请求JSON反序列化后会得到List<QueryCondition>类型的对象,直接操作这个列表即可。
普通嵌套循环实现(逻辑直观,便于调试)
先遍历外层列表拿到每个对象的k1值,再遍历当前对象的k2列表,逐个拼接SQL:
// 假设requestList是反序列化得到的List<QueryCondition> for (QueryCondition condition : requestList) { Integer col1Value = condition.getK1(); for (Integer col2Value : condition.getK2()) { // 生产环境强烈建议使用预编译SQL代替字符串拼接,避免SQL注入风险 String sql = String.format("select * from table where col1=%d and col2=%d", col1Value, col2Value); // 此处可直接执行数据库调用,不需要等所有SQL拼接完成 System.out.println(sql); } }
运行后输出完全匹配你的预期结果。
Stream流实现(代码更简洁)
通过flatMap展开内层的k2列表,直接生成所有需要的SQL语句:
List<String> sqlList = requestList.stream() .flatMap(condition -> condition.getK2().stream() .map(col2Val -> String.format("select * from table where col1=%d and col2=%d", condition.getK1(), col2Val)) ) .collect(Collectors.toList()); // 遍历生成的SQL执行数据库操作 sqlList.forEach(sql -> { // 填入你的数据库调用逻辑 System.out.println(sql); });
注意事项
- SQL注入风险提示:如果k1、k2的值来自用户输入,直接字符串拼接SQL会有严重的注入漏洞,请替换为JDBC预编译语句、或者ORM框架的参数绑定写法,不要直接拼接参数值到SQL中。
- 如果不需要留存所有生成的SQL,不管是循环写法还是Stream写法,都可以在生成SQL的当下直接发起数据库调用,不需要额外用列表存储所有SQL,减少内存占用。
内容的提问来源于stack exchange,提问作者user4324324
相关产品推荐
相关产品推荐

