JDBC使用where条件在resultSet中返回空值。我试图获取所有列,但未返回任何值

问题描述 投票:1回答:1

我想使用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();
}
java sql jdbc where-clause
1个回答
0
投票

我不认为这是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();

© www.soinside.com 2019 - 2024. All rights reserved.