问题描述
我正在使用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
这将为您提供帮助。