我编写了一个简单的检查方法,以检查MySQL数据库中是否存在给定字符串ID的数据:

    public boolean checkForData(String etfSymbol){
    try (Connection conn = DriverManager.getConnection(DBURL, USERNAME, PASSWORD)) {
        if (conn != null) {
            PreparedStatement statement = conn.prepareStatement(CHECK_FOR_DATA);
            statement.setString(1, etfSymbol);
            ResultSet result = statement.executeQuery();
            if (!result.isBeforeFirst()){
                System.out.println("No data currently in database for this ETF");
                return false;
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    System.out.println("Data already exists in database for this ETF");
    return true;
}


查询:

    final String CHECK_FOR_DATA = "SELECT COUNT(*) FROM basic_etf_data WHERE etf_name = (?)"


我可以使用MySQL工作台确认在表中没有我所请求的ID的数据(实际上根本没有数据),但条件评估为true。
这是ResultSet的调试输出:

java - 空ResultSet仍评估为true,JDBC-LMLPHP
java - 空ResultSet仍评估为true,JDBC-LMLPHP

起初,“ InvalidRowReason”使我相信它的评估结果为true,因为索引实际上在第一个索引之前,但是isBeforeFirst()的文档状态为:


  如果光标在第一行之前,则为true;否则为false。如果光标在任何其他位置或结果集不包含任何行,则返回false


然后,我展开rowData并发现大小等于1:

java - 空ResultSet仍评估为true,JDBC-LMLPHP

我不知道怎么回事,因为我可以确认表中没有行,甚至没有数据。我想念什么?

最佳答案

因为您在SQL中创建一个COUNT,并且COUNT始终有一个结果(一行),所以在您的情况下为0。无论如何,我可能会将查询写为

SELECT * FROM basic_etf_data WHERE etf_name = ? LIMIT 1

关于java - 空ResultSet仍评估为true,JDBC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39184747/

10-10 20:08