进入 JSON 来自 sql 查询的所有行 JAVA
Get in to JSON all the rows from sql query in JAVA
我得到了下一个密码。我想我只需要做一点改变,但我不知道是什么。该代码仅 returns 最后一行,但我想查看所有响应行。如果我声明 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);
}
您正在遍历结果集并将每一行添加到 JSONObject
但没有将 JSONObject
添加到 JSONArray
.
只需将 JSONObject (obj)
添加到 JSONArray (json)
中,您将在响应中得到所有 rows/records。 :)
@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);
在 Db2 的 SQL/JSON 支持下本地执行此操作
您可能无需在 Java 中实现任何逻辑即可从 Db2 数据库中获取此类 JSON 文档,just use the Db2 native SQL/JSON capabilities, as I've described in this article。
而不是:
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 背后的公司工作)
我得到了下一个密码。我想我只需要做一点改变,但我不知道是什么。该代码仅 returns 最后一行,但我想查看所有响应行。如果我声明 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);
}
您正在遍历结果集并将每一行添加到 JSONObject
但没有将 JSONObject
添加到 JSONArray
.
只需将 JSONObject (obj)
添加到 JSONArray (json)
中,您将在响应中得到所有 rows/records。 :)
@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);
在 Db2 的 SQL/JSON 支持下本地执行此操作
您可能无需在 Java 中实现任何逻辑即可从 Db2 数据库中获取此类 JSON 文档,just use the Db2 native SQL/JSON capabilities, as I've described in this article。
而不是:
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 背后的公司工作)