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

Java 无法从SQL执行中正确获取结果集,java,mysql,sql,prepared-statement,resultset,Java,Mysql,Sql,Prepared Statement,Resultset,我为学校创建了一些任务数据库。每个任务记录都有用户名、说明、taskday和taskhour列 我想通过两个值来提取记录:taskhour和taskday,或者分别提取 因此,我有一个函数,用于获取任务对象,检查taskday或taskhour是否为空,并相应地准备查询。但由于某些原因,ResultSet出现了问题…这是我的函数: public List<Task> getUserTasks(Task task) throws SQLException { List<

我为学校创建了一些任务数据库。每个任务记录都有用户名、说明、taskday和taskhour列

我想通过两个值来提取记录: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;      
}   
公共列表getUserTasks(任务任务)引发SQLException{ List listOfTasks=new ArrayList(); 试一试{ 字符串查询=”; 准备好的报表; if(task.getDay()!=0&&task.getHour()!=0){ query=“从任务中选择*,其中USERNAME=?和TASKDAY=?以及TASKHOUR=?”; pStatement=connection.prepareStatement(查询); pStatement.setString(1,task.getUsername()); setInt(2,task.getDay()); setInt(3,task.getHour()); }else if(task.getDay()==0){ query=“从任务中选择*,其中用户名=?和任务小时=?”; pStatement=connection.prepareStatement(查询); pStatement.setString(1,task.getUsername()); setInt(2,task.getHour()); }否则{ query=“从USERNAME=?和TASKDAY=?”的任务中选择*; pStatement=connection.prepareStatement(查询); pStatement.setString(1,task.getUsername()); setInt(2,task.getDay()); } 结果集rs; rs=pStatement.executeQuery(); 如果(rs.next()){ Task taskToAdd=新任务(); taskToAdd.setUsername(rs.getString(“USERNAME”); taskToAdd.setDescription(rs.getString(“DESCRIPTION”); taskToAdd.setDay(rs.getInt(“TASKDAY”); taskToAdd.setHour(rs.getInt(“TASKHOUR”); 任务列表。添加(任务添加); } }catch(SQLException-ex){ 例如printStackTrace(); } 返回任务列表; } 我做错什么了吗


谢谢

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

作为启动器,拆下紧靠此线前面的七条线:

ResultSet rs;

更新

规范中说“检查taskday或taskhour”是否为空

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

我不清楚“不平等到零”是什么意思“空”

我们没有看到的是
getDay
getHour
方法返回的类型。从代码中,看起来它们正在返回
int
原语。(假设没有对null进行测试,并且与整数文本进行比较。)但这只是一个假设;我没有办法检查

我通常会在不平等性比较中加入帕伦斯

if ( ( task.getDay() != 0 ) && ( task.getHour() != 0 ) )  {
     ^                    ^    ^                     ^
我认为Java中不需要额外的参数。但我相当肯定这不是违法的。但我不是一个真正的Java人。(当我包括像这样的额外参数时,我会考虑操作符的优先级。(我不需要记住哪个操作符的优先级更高。)

另外,SELECT语句正在执行一个
SELECT*
。我将明确列出要返回的列,而不是使用
*
。例如:

 SELECT t.USERNAME, t.DESCRIPTION, t.TASKDAY, t.TASKHOUR FROM TASKS t ...
但我真的不认为这是你问题的原因

我担心没有一个
finally
块关闭语句

} finally {
    if (pStatement != null) { pStatement.close(); }
}
另外,我会将return
getDay()
getHour()
分配给局部变量

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

} finally {
    if (pStatement != null) { pStatement.close(); }
}
不过,我也不认为你的写作方式有什么特别违法的地方


对于调试,我将忽略从getDay()和getHour()返回的值,并将特定的文本赋值给局部变量

除了这些评论,我真的不能为你调试你的程序


是否要从结果集中返回多行

要获取所有行,请使用
,而如果
,则不使用

 while (rs.next())
 ^^^^^ 
while
形成一个循环,将重复该循环,直到表达式
rs.next()
的计算结果不再为true


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

“…ResultSet有问题…”您必须更具体一些。ResultSet有什么问题?我怀疑问题是返回的ArrayList最多包含一行。我怀疑您希望
while(rs.next())
。使用
while
形成一个循环,这样操作就会重复,直到没有更多的行可检索。(我仍然支持前面答案中的所有建议,特别是在
finally
块中关闭语句。)很抱歉,假设if/else不在那里,但在后面加了一行,编辑了代码。这不是问题所在。。