无法从 SQL 执行中正确获取结果集

Cant get properly the ResultSet from SQL execution

我有一些数据库是我用任务为学校创建的。每个任务记录都有用户名、描述、任务日、任务时间列。

我想按两个值提取记录:taskhour 和 taskday 或单独提取每个值。

所以我有一个函数可以获取任务对象并检查 taskday 或 taskhour 是否为空并相应地准备查询。但是出于某种原因,ResultSet 出了点问题……这是我的功能:

public List<Task> getUserTasks(Task task) throws SQLException {

    List<Task> listOfTasks = new ArrayList<>();

    try {

         String query = "";
         PreparedStatement pStatement;

        if (task.getDay() != 0 && task.getHour() != 0) {
            query = "select * from TASKS where USERNAME=? and TASKDAY=? and TASKHOUR=?";
            pStatement = connection.prepareStatement(query);
            pStatement.setString(1, task.getUsername());
            pStatement.setInt(2, task.getDay());
            pStatement.setInt(3, task.getHour());

        } else if (task.getDay() == 0) {
            query = "select * from TASKS where USERNAME=? and TASKHOUR=?";
            pStatement = connection.prepareStatement(query);
            pStatement.setString(1, task.getUsername());
            pStatement.setInt(2, task.getHour());

        } else {
            query = "select * from TASKS where USERNAME=? and TASKDAY=?";
            pStatement = connection.prepareStatement(query);
            pStatement.setString(1, task.getUsername());
            pStatement.setInt(2, task.getDay());
        }


        ResultSet rs;
        rs = pStatement.executeQuery();

        if (rs.next()) {
            Task taskToAdd = new Task();

            taskToAdd.setUsername(rs.getString("USERNAME"));
            taskToAdd.setDescription(rs.getString("DESCRIPTION"));
            taskToAdd.setDay(rs.getInt("TASKDAY"));
            taskToAdd.setHour(rs.getInt("TASKHOUR"));

            listOfTasks.add(taskToAdd);
        }

    } catch (SQLException ex) {
        ex.printStackTrace();
    }

    return listOfTasks;      
}   

我是不是做错了什么?

谢谢!

在设置 $query 的 if else 块之后,代码接下来再次设置 $query。清除刚刚在 if else 块中完成的工作。

首先,删除紧接此行之前的七行:

ResultSet rs;

更新

规范说 "check if the taskday or taskhour" 是空的。

条件测试 (!= 0) 正在检查不等式是否为零。

我不清楚 "inequality to zero" 是 "empty" 的意思。

我们看不到 return 由 getDaygetHour 方法编辑的是什么类型。从代码来看,它们看起来像是 returning int 原语。 (假设没有针对 null 的测试,并且比较的是整数文字。)但这只是一个假设;我没有办法检查。

我通常会在不平等比较中包含 parens。

if ( ( task.getDay() != 0 ) && ( task.getHour() != 0 ) )  {
     ^                    ^    ^                     ^

我认为 Java 不需要额外的 parens。但我相当确定这不违法。但我并不是真正的 Java 人。 (当我像这样包含额外的 parens 时,它会为我处理运算符优先级。(我不必记住哪个运算符具有更高的优先级。)

此外,SELECT 语句正在执行 SELECT *。我会明确列出要 returned 的列,而不是使用 *。例如:

 SELECT t.USERNAME, t.DESCRIPTION, t.TASKDAY, t.TASKHOUR FROM TASKS t ...

但我真的不认为这是你的问题的原因。

我很烦恼没有 finally 块来关闭语句。

} finally {
    if (pStatement != null) { pStatement.close(); }
}

此外,我会将 return getDay()getHour() 分配给局部变量。在进入方法时,我只会这样做一次。

然后我会在条件测试中引用局部变量,并作为方法中的参数来绑定到准备好的语句。

不过,我不认为您的书写方式有任何特别违法的地方。


为了调试,我会忽略从 getDay() 和 getHour() 编辑的值 return,并将特定文字赋值给局部变量。我会这样做来完成所有逻辑。

除了那些评论,我真的无法为你调试你的程序。

How to debug small programs http://ericlippert.com/2014/03/05/how-to-debug-small-programs/

您想要 return 结果集中的多行吗?

要获取 所有 行,请使用 while 而不是 if:

 while (rs.next())
 ^^^^^ 

while 形成一个循环,将重复循环直到表达式 rs.next() 不再计算为真。

if只执行一次。您最多会返回一行。