【问题标题】:Get in to JSON all the rows from sql query in JAVA获取来自 JAVA 中 sql 查询的所有行的 JSON
【发布时间】:2019-02-10 22:38:44
【问题描述】:

我得到了下一个代码。我想我只需要做一点改变,但我不知道是什么。该代码仅返回最后一行,但我想查看所有响应行。如果我声明 LIMIT 10,那么我希望得到 10 个结果作为响应。

我应该改变什么?

谢谢。

    @RequestMapping(value="/url/results/", method=RequestMethod.GET)
    public JsonResponse getResults() throws SQLException {

        Connection connection = ConnSingle.getInstance().getConnection(env);
        String selectSql = "SELECT * FROM Lib.Table WHERE YEARS=10 LIMIT 10";

        Statement statement = connection.createStatement();
        ResultSet rs = statement.executeQuery(selectSql);


        JSONArray json = new JSONArray();
        ResultSetMetaData rsmd = rs.getMetaData();
        JSONObject obj = new JSONObject();

        System.out.println(rsmd);

        while(rs.next()) {
            int numColumns = rsmd.getColumnCount();
            for (int i=1; i<=numColumns; i++) {
                String column_name = rsmd.getColumnName(i);
                obj.put(column_name, rs.getObject(column_name));
            }
        }

        rs.close();
        statement.close();
        connection.close();

        return new JsonResponse(obj);
    }

【问题讨论】:

    标签: java sql json db2 resultset


    【解决方案1】:

    您正在遍历结果集并将每一行添加到JSONObject,但没有将JSONObject 添加到JSONArray

    只需将JSONObject (obj) 添加到JSONArray (json) 中,您将获得响应中的所有行/记录。 :)

    【讨论】:

      【解决方案2】:

      @jaydip 是对的(他被我打败了几分钟)。 这是一个例子...... 您将所有结果推送到同一个 obj 对象中。 要显示所有结果,您必须将“obj”推送到这样的数组中:

      JSONArray objects = new JSONArray();
      while(rs.next()) {
                  int numColumns = rsmd.getColumnCount();
                  for (int i=1; i<=numColumns; i++) {
                      String column_name = rsmd.getColumnName(i);
                      obj.put(column_name, rs.getObject(column_name));
                      objects.add(obj);
                  }
              }
      rs.close();
              statement.close();
              connection.close();
      
              return new JsonResponse(objects);
      

      【讨论】:

      • 哦...我明白了...我需要推送数组内的所有对象,但是当我要推送objects.push(obj);时,推送方法不起作用:error: cannot find symbol object.&lt;push&gt;(obj); D; !!!我只知道在 javascript 中它更容易......
      • 是的,我有解决方案,不是推送,是添加 :D !!! json.add(obj); for 循环之前
      • 没问题 @jgmcontessa ,但是 objects.add(obj); 必须在 for 循环的 key 之后才能在迭代时添加对象。非常感谢!!!
      【解决方案3】:

      使用 Db2 的 SQL/JSON 支持以本机方式进行操作

      您可能无需在 Java 中实现任何逻辑即可从 Db2 数据库just use the Db2 native SQL/JSON capabilities, as I've described in this article 中获取此类 JSON 文档。

      代替:

      SELECT * FROM Lib.Table WHERE YEARS=10 LIMIT 10
      

      写:

      SELECT cast(('[' || listagg(
        json_object(
          KEY 'id' VALUE t.id,
          KEY 'years' VALUE t.years,
          ...
        ), ',') || ']') AS varchar(32672))
      FROM lib.table t
      WHERE t.years = 10
      FETCH FIRST 10 ROWS ONLY
      

      不幸的是,Db2 还不支持标准 SQL/JSON JSON_ARRAYAGG() 函数,这就是为什么您必须自己执行字符串连接解决方​​法的原因。

      使用第三方库

      如果在这种情况下您可以选择使用第三方库,jOOQ can handle that emulation of JSON_ARRAYAGG for you。在像这样的简单案例中使用 jOOQ,您也可以像这样从 JDBC ResultSet 导出 JSON:

      String json = ctx.fetch(rs).formatJSON();
      

      (免责声明:我为 jOOQ 背后的公司工作)

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多