我想使用where条件从数据库中获取所有数据。但是resultSet返回空值。但是,当我使用Integer而不是string时,它可以正常工作,但是我不希望这样做。
我在SQL方面的专家并不多,但是当我在SQL Server中运行查询时,它运行良好。
public JSONObject searchInternship1(String Category) throws SQLException {
ResultSet result;
Connection con = null;
PreparedStatement stmt = null;
JSONArray jsonArray = new JSONArray();
JSONObject mainObject1 = new JSONObject();
JSONObject jsonObject = new JSONObject();
try {
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
con = DriverManager.getConnection("jdbc:oracle:thin:@144.217.163.57:1521:XE", "mad310team2", "anypw");
String sql;
sql = ("SELECT * FROM INTERNSHIP WHERE CATAGORY= ?");
stmt = con.prepareStatement(sql);
// con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
stmt.setString(1, Category);
result = stmt.executeQuery();
System.out.println("resultttt " + result);
String status;
Instant instant = Instant.now();
long time = instant.getEpochSecond();
if (result.next() == false) {
status = "Failed";
mainObject1.accumulate("Status :", status);
mainObject1.accumulate("Timestamp :", time);
mainObject1.accumulate("Message :", " Fetching Failed");
mainObject1.accumulate("why not", Category);
// System.out.println("hellooooo "+ result);
} else {
do {
mainObject1.accumulate("why not111", Category);
status = "Success";
jsonObject.accumulate("Id :", result.getInt("INT_ID"));
jsonObject.accumulate("CONTACT PERSON", result.getString("CONTACT_PERSON"));
jsonObject.accumulate("INCENTIVE", result.getString("INCENTIVE"));
jsonObject.accumulate(" VENUE", result.getString("VENUE"));
jsonObject.accumulate("DATE OF TEST", result.getDate("DATE_OF_TEST").toString());
jsonObject.accumulate("DATE OF TEST", result.getString("TIME_OF_TEST"));
jsonObject.accumulate("PROCEDURE", result.getString("PROCEDUREE"));
jsonObject.accumulate("No. OF VACANCIES", result.getInt("NO_OF_VACANCIES"));
jsonObject.accumulate("COMPANY ID", result.getInt("COMPANY_ID"));
jsonObject.accumulate("CATAGORY", result.getString("CATAGORY"));
jsonArray.add(jsonObject);
jsonObject.clear();
} while (result.next());
// result = result + r.getString("data");
mainObject1.accumulate("Details of jobs: ", jsonArray);
}
stmt.close();
con.close();
} catch (SQLException ex) {
// System.out.println("Error at111:" + ex.getClass().getName() + ex.getMessage());
Logger.getLogger(Register_Detail.class.getName()).log(Level.SEVERE, null, ex);
}
return mainObject1;
}
@GET
@Path("searchInternship&{value1}")
@Produces(MediaType.TEXT_PLAIN)
public String searchInternship(@PathParam("value1") String Category)
throws SQLException {
JSONObject result = searchInternship1(Category);
return result.toString();
}
我不认为这是JDBC问题。我认为这与您如何从结果集中读取数据有关。
在createInternship1
方法的顶部,创建一个JSONObject对象。假设结果集至少返回一行。对于从结果集中读取的第一行,您的代码然后从结果集中读取值并将它们写入JSONObject,然后再将JSONObject添加到JSON数组jsonArray
。
到目前为止,您的代码正在执行您想要的操作。您有一个带有单个对象的JSON数组,其中包含从结果集中第一行读取的数据。但是,问题出在下一步。
然后您清除您的JSONObject。
您的数组不包含JSONObject的副本,它包含the same对象。
因此,您的数组现在包含一个空的JSONObject。您从结果集中读出的数据已删除。
随着您的代码在结果集中的其他行中移动,它遇到了另一个问题。它将更多数据读取到先前创建的相同JSONObject中,将此相同的JSONObject(已存在于数组中)添加到数组中,然后再次清除此相同的JSONObject。因此,对于从结果集中读取的每一行,您将最终得到一个包含相同空JSONObject的JSON数组。
我以为您正在使用json-simple库处理JSON。最初我以为您使用的是org.json,但是该库中的JSONObject类没有clear()
方法,而json-simple的JSONObject类确实具有此方法。 json-simple的JSONObject类扩展了java.util.HashMap
,并且调用get()
的HashMap
方法将为不在地图中的键返回null
。您的一个JSONObject为空,因此映射中没有键,因此,从对该对象的null
方法的任何调用都将始终返回get()
。这有望解释为什么您返回空值。
您可以通过为do ... while
循环的每次迭代创建一个新的JSONObject而不是一次在顶部,将其添加到JSON数组,并删除清除JSON对象的行来解决此问题:
do {
JSONObject jsonObject = new JSONObject(); // add this line
mainObject1.accumulate("why not111", Category);
status = "Success";
jsonObject.accumulate("Id :", result.getInt("INT_ID"));
jsonObject.accumulate("CONTACT PERSON", result.getString("CONTACT_PERSON"));
// ... various similar lines omitted for clarity
jsonObject.accumulate("CATAGORY", result.getString("CATAGORY"));
jsonArray.add(jsonObject);
} while (result.next());
您还需要在代码中进一步删除行JSONObject jsonObject = new JSONObject();
。