来自其他类的空结果语句

时间:2017-11-18 09:59:05

标签: java mysql sqlite jdbc resultset

我试图从另一个类检索的结果集返回null,即使查询有效。我正在尝试根据数据库中保存的记录初始化我的对象,这意味着如果最初有一个记录sqlite,我检索一个最新的date.Else,我尝试从mysql数据库中检索最早的一个。应该从mysql数据库中检索结果集的代码如下:

   public ResultSet lowestDate() throws SQLException {
    ResultSet rs1 = null;
    String resultQuery = "SELECT * FROM alarm ORDER BY `timestamp` ASC LIMIT 1";
    rs1 = stmt.executeQuery(resultQuery);
    return rs1;
}

语句是全局初始化的。我在另一个类中调用它:

public void setLastAlarm() throws SQLException, ParseException {
    String liteQuery = "SELECT * FROM alarm_entries ORDER BY date(`timestamp`) DESC LIMIT 1";
    conn.connectLite();
    Connection getCon = conn.getLiteConnection();
    try {
        stmt = getCon.createStatement();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    try {
        rs = stmt.executeQuery(liteQuery);
        if (rs.next()) {
            //while (rs.next()) {
            nuDate = rs.getString("timestamp");
            newDate = format.parse(nuDate);
            lastAlarm.setBacklogId(rs.getBytes("backlog_id"));
            lastAlarm.setTimestamp(newDate);
            //}
        }
        else{
            rsq=mysqlConnection.lowestDate();
            lastAlarm.setTimestamp(format.parse(rsq.getString("timestamp")));
            lastAlarm.setBacklogId(rsq.getBytes("backlog_id"));
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

public void run() {
    try {
        setLastAlarm();

1 个答案:

答案 0 :(得分:0)

您永远不会在ResultSet#next()辅助方法返回的结果集上调用lowestDate()。因此,游标永远不会前进到结果集中的第一个(也是唯一的)记录。但我认为以这种方式计算JDBC代码是一个坏主意。相反,只需内联你的两个查询:

try {
    rs = stmt.executeQuery(liteQuery);
    if (rs.next()) {
        nuDate = rs.getString("timestamp");
        newDate = format.parse(nuDate);
        lastAlarm.setBacklogId(rs.getBytes("backlog_id"));
        lastAlarm.setTimestamp(newDate);
    }
    else {
        String resultQuery = "SELECT * FROM alarm ORDER BY timestamp LIMIT 1";
        rs = stmt.executeQuery(resultQuery);
        if (rs.next()) {
            String ts = rs.getString("timestamp");
            lastAlarm.setTimestamp(format.parse(ts));
            lastAlarm.setBacklogId(rs.getBytes("backlog_id"));
        }
    }
} catch (Exception e){
    e.printStackTrace();
}