【发布时间】:2020-08-23 16:28:12
【问题描述】:
我必须在 java 中创建 json 文件。当我在 where 子句中传递参数时,我可以创建 json 文件。我正在从 Oracle 数据库中读取数据 以下是我的数据。
当我发送参数 Select * from Data where tablename='ITEM' 时,我的代码为 org 创建了文件 ITEM.json。
情况是明天我不知道 TABLENAME 列中有多少不同的表名。例如 ITEM、ORG、FEATURE 等。
我可以通过在不传递参数的情况下读取数据来在 java 中创建文件吗?表示在上述数据的情况下应该有 2 个文件。 ITEM.json 和 ORG.json。我不想在查询中使用where clause。我的程序应该根据表中的数据创建文件。
我想要以下格式的数据。 项目.json
{"add":[{"canonicalName":"Apple Computers","synonyms":["Apple","Apple Inc"]},{"canonicalName":"Google India","synonyms":["Google"]},{"canonicalName":"IBM","synonyms":["IBM Corporation"]}],"update":[{"canonicalName":"Infosys","synonyms":["Infosys Tech"]},{"canonicalName":"Wipro Tech","synonyms":["Wipro Technology"]}],"delete":[{"canonicalName":"IBM","synonyms":["IBM Corporation"]},{"canonicalName":"TCS"}]}
ORG.json
{"add":[{"canonicalName":"Apple Computers","synonyms":["Apple","Apple Inc"]},{"canonicalName":"Google India","synonyms":["Google"]},{"canonicalName":"IBM","synonyms":["IBM Corporation"]}],"update":[{"canonicalName":"Infosys","synonyms":["Infosys Tech"]},{"canonicalName":"Wipro Tech","synonyms":["Wipro Technology"]}],"delete":[{"canonicalName":"IBM","synonyms":["IBM Corporation"]},{"canonicalName":"TCS"}]}
我下面的代码工作正常,但是当我为 ORG 传递参数 where TABLENAME='ITEM' .same 时,这工作正常。我希望我的代码读取表数据并根据 TABLENAME 列中的唯一值创建文件。
public String createJsonFile(String dynamicEntityName) throws Exception
{
System.out.println("Inside createJsonFile");
String query="select * from dynamicentitygtt where tablename=?";
PreparedStatement prepstatement=connection.prepareStatement(query);
prepstatement.setString(1,dynamicEntityName);
ResultSet rs=prepstatement.executeQuery();
List<EntityDataNEW> dataList= new ArrayList<EntityDataNEW>();
while(rs.next());
{
EntityDataNEW entityData= new EntityDataNEW();
String entityName=rs.getString("ORGNAME");
String synonyms=rs.getString("SYNONYMS");
entityData.setSynonyms(synonyms);
entityData.setItemname(entityName);
entityData.setOperation(rs.getString("OPERATION"));
dataList.add(entityData);
}
JsonArrayBuilder add=Json.createArrayBuilder();
JsonArrayBuilder delete=Json.createArrayBuilder();
JsonArrayBuilder update=Json.createArrayBuilder();
for(EntityDataNEW data: dataList)
{
switch(data.getOperation())
{
case "delete":
JsonObjectBuilder deleteObj=Json.createObjectBuilder();
JsonArrayBuilder deleteSynonyms=Json.createArrayBuilder();
deleteObj.add("canonicalName", data.getItemname());
deleteSynonyms.add(0,data.getSynonyms());
deleteObj.add("synonyms", data.getSynonyms());
deleteObj.add("synonyms", data.getSynonyms());
delete.add(deleteObj);
delete.add(deleteSynonyms);
break;
case "update":
JsonObjectBuilder updateObj=Json.createObjectBuilder();
JsonArrayBuilder modifySynonyms=Json.createArrayBuilder();
updateObj.add("canonicalName", data.getItemname());
modifySynonyms.add(0,data.getSynonyms());
updateObj.add("synonyms", data.getSynonyms());
update.add(updateObj);
update.add(modifySynonyms);
break;
case "add":
JsonObjectBuilder addObj=Json.createObjectBuilder();
JsonArrayBuilder addSynonyms=Json.createArrayBuilder();
addObj.add("canonicalName", data.getItemname());
addSynonyms.add(0,data.getSynonyms());
addObj.add("synonyms",addSynonyms);
add.add(addObj);
add.add(addSynonyms);
break;
default:
break;
}
rs.close();
connection.close();
}
JsonObjectBuilder mainObj= Json.createObjectBuilder();
mainObj.add("delete",delete);
mainObj.add("update", update);
mainObj.add("add",add);
String data = mainObj.build().toString();
System.out.println(data);
String filePath= ODAParams.ENTITY_FILE_PATH+"/"+dynamicEntityName+".json";
BufferedWriter out = new BufferedWriter(new FileWriter(filePath));
out.write(data);
out.close();
System.out.println("End of file writing code");
return filePath;
}
EntityDataNEW is my POJO class.
我可以根据数据创建 2 个不同的文件而不在 where 子句中传递 TABLENAME
【问题讨论】:
-
当要求基于
TABLENAME进行分类时。为什么不使用Group By表达式? -
数据也可以通过表达式分组吗?
-
它只会给出不同的表名,是否也可以给出数据?你能建议修改上面的代码吗?
-
在你过去两天关于这个问题的第二个问题中(我相信你到目前为止至少有四个问题),我向你展示了如何获得每个唯一
TABLENAME的输出一行,对应的 JSON 文档(对于那个TABLENAME)在第二列。从这个结果来看,使用几乎任何工具生成实际的文本文件都是微不足道的。为什么要走参数化查询路线? -
@mathguy 非常感谢 mathguy 的帮助。实际上我无法在 java 中返回该数据。我必须使用 jersey 客户端将该数据注入 API。
标签: java spring spring-boot jdbc logic