在数据库而不是Java中生成json文件 查询#1 结果1美化查询#2 结果#2美化

问题描述

我正在使用table数据库中读取一个resultset。稍后我将使用这些数据来生成json文件

我想在数据库生成json文件,并将该文件返回给java,因为我的Java代码将消耗POST API.

代码是这样的

    String query="select * from dynamicentitygtt";
    PreparedStatement prepstatement=connection.prepareStatement(query);
    ResultSet rs=prepstatement.executeQuery()
        while rs.next()
        {
          //Load data to POJO
            
        }
      //call method to generate json file.
      //Inject file data to API

我想要什么。

String query="select * from dynamicentitygtt";
        PreparedStatement prepstatement=connection.prepareStatement(query);
        ResultSet rs=prepstatement.executeQuery()
        //here I want file from database.

我的数据库应返回json文件。我可以在数据库中创建过程。我也可以使用Callable。我也可以从表创建json文件。 但是我不知道如何从数据库返回文件

如果我的理解不正确,请原谅我。

解决方法

由于您已经注意到您使用的是Oracle 18c,因此可以访问JSON_OBJECT,JSON_OBJECTAGG,JSON_ARRAY,and JSON_ARRAYAGG SQL函数。使用这些功能,您应该能够仅通过SQL查询创建所需的JSON结构,而不需要生成文件并将其传递回Java调用。需要注意的一项是,如果要生成大型JSON对象,则需要修改查询中任何JSON函数调用中的 RETURNING 子句,否则JSON将无效。

下面是有关如何使用功能的一些示例:

查询#1

WITH
    emp (employee_id,first_name,last_name,department_number)
    AS
        (SELECT 1,'John','Doe',100 FROM DUAL
         UNION ALL
         SELECT 2,'Jane','Smith',100 FROM DUAL
         UNION ALL
         SELECT 3,'Robert','Jones',200 FROM DUAL
         UNION ALL
         SELECT 4,'Alan','Carter',300 FROM DUAL)
SELECT json_arrayagg (json_object (*))
  FROM emp;

结果1(美化)

[
  {
    "EMPLOYEE_ID": 1,"FIRST_NAME": "John","LAST_NAME": "Doe","DEPARTMENT_NUMBER": 100
  },{
    "EMPLOYEE_ID": 2,"FIRST_NAME": "Jane","LAST_NAME": "Smith",{
    "EMPLOYEE_ID": 3,"FIRST_NAME": "Robert","LAST_NAME": "Jones","DEPARTMENT_NUMBER": 200
  },{
    "EMPLOYEE_ID": 4,"FIRST_NAME": "Alan","LAST_NAME": "Carter","DEPARTMENT_NUMBER": 300
  }
]

查询#2

WITH
    emp (employee_id,300 FROM DUAL)
  SELECT json_arrayagg (
             json_object (
                     'department_number' VALUE department_number,'employees' VALUE
                         json_arrayagg (
                             json_object ('first_name' VALUE first_name,'last_name' VALUE last_name))))
    FROM emp
GROUP BY department_number;

结果#2(美化)

[
  {
    "department_number": 100,"employees": [
      { "first_name": "John","last_name": "Doe" },{ "first_name": "Jane","last_name": "Smith" }
    ]
  },{
    "department_number": 200,"employees": [{ "first_name": "Robert","last_name": "Jones" }]
  },{
    "department_number": 300,"employees": [{ "first_name": "Alan","last_name": "Carter" }]
  }
]
,

在Java中,使用以下方法可以创建Map 的列表。

Map的columnName和value作为该列的值的键。

public List<Map<String,String>> getList(ResultSet resultSet) throws SQLException {
        List<Map<String,String>> mapList = new ArrayList<>();
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnNumber = resultSetMetaData.getColumnCount();
        while (resultSet.next()) {
            Map<String,String> map = new HashMap<>();
            int count = 1;
            while (count <= columnNumber) {
                String columnName = resultSetMetaData.getColumnName(count);
                map.put(columnName,resultSet.getString(columnName));
                count++;
            }
            mapList.add(map);
        }
        return mapList;
    }

一旦您能够创建Map,就可以使用多个库like this

从其中创建任何json字符串或json对象。

这将为您提供帮助。