Comment comment;
ArrayList<Comment> commentList = null;
try{
ConnectionFactory myFactory = ConnectionFactory.getFactory();
Connection conn = myFactory.getConnection();
int i = 1; int j = 1; int k = 1;
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM COMMENT WHERE deletestatus = 0 and workid = ?");
PreparedStatement pstmtLName = conn.prepareStatement("SELECT * FROM LEADER WHERE leaderid = ?");
PreparedStatement pstmtMName = conn.prepareStatement("SELECT * FROM MEMBER WHERE memberid = ?");
pstmt.setInt(i++, Integer.parseInt(projid));
ResultSet rs = pstmt.executeQuery();
System.out.print(rs);
commentList = new ArrayList<Comment>();
while(rs.next())
{
comment = new Comment();
comment.setDetails(rs.getString("details"));
comment.setDateadded(rs.getTimestamp("dateadded"));
comment.setUrgency(rs.getInt("urgency"));
if(rs.getInt("leaderid") != 0){
comment.setLeaderid(rs.getInt("leaderid"));
pstmtLName.setInt(j++, rs.getInt("leaderid"));
ResultSet rs2 = pstmtLName.executeQuery();
if(rs2.next()){
comment.setFullname(rs2.getString("firstname") +" " + rs2.getString("lastname"));
}
}
if(rs.getInt("memberid") != 0) {
comment.setMemberid(rs.getInt("memberid"));
System.out.print("in the loop");
pstmtMName.setInt(j++, rs.getInt("memberid"));
ResultSet rs3 = pstmtMName.executeQuery();
if(rs2.next()){
comment.setFullname(rs3.getString("firstname") +" " + rs3.getString("lastname"));
}
}
comment.setProjid(Integer.parseInt(projid));
commentList.add(comment);
}
return commentList;
}
上面代码的问题在于它只返回结果集的第一个结果。
当我删除IF
子句中的两个WHILE(RS.NEXT)
子句时,它返回了所有需要的结果但不完整的信息,因为我还需要if语句中的查询。
如果你们知道确切的问题,请帮忙告诉我你们是否需要更多信息。谢谢!
答案 0 :(得分:2)
在这里,问题似乎在
pstmtLName.setInt(j++, rs.getInt("leaderid"));
pstmtMName.setInt(j++, rs.getInt("memberid"));
对于每个真实条件,j的值将增加,直到循环迭代。
因此,它增加了parameterIndex
预先准备的声明。
应该是
pstmtLName.setInt(1, rs.getInt("leaderid"));
pstmtMName.setInt(1, rs.getInt("memberid"));
答案 1 :(得分:2)
您已定义int k
但未使用它。我假设你想用它来设置memberid
参数
改变
pstmtMName.setInt( j++, rs.getInt( "memberid" ) );
到
pstmtMName.setInt( k++, rs.getInt( "memberid" ) );
它应该有效。
我想知道为什么在查询中只看到一个参数标记i++
时,使用j++
,k++
和?
来设置语句的参数值。您应该直接使用pstObject.setInt( 1, ...
。否则,如果rs
获取的记录多于leaderid != 0
和memberid != 0
的记录,则会导致标记索引增加,例如pstObject.setInt( 2, ...
,这是您的无效参数查询案例和投掷以及SQLException
。
由于您在while循环中重复使用相同的pstObject
,我建议使用pstObject.clearParameters()
清除当前参数值。虽然这是可选的,但在某些情况下,立即释放当前参数值使用的资源很有用。