0
    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ステートメント内のクエリも必要なため、不完全な情報が返されました。

あなたたちが正確な問題を知っているなら助けてください、そしてあなたたちがもっと情報が必要かどうか私に教えてください。ありがとうございました!

4

2 に答える 2

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"));
于 2012-05-16T09:33:16.853 に答える
2

定義int kしましたが、使用しませんでした。パラメータの設定に使用したいと思いmemberidます。
変化する

pstmtMName.setInt( j++, rs.getInt( "memberid" ) );  

pstmtMName.setInt( k++, rs.getInt( "memberid" ) );  

そしてそれは機能しているはずです。

また、クエリにパラメータマーカーが1つしかない場合に、なぜi++、、j++およびステートメントのパラメータ値を設定するのか疑問に思います。直接使用する必要があります。それ以外の場合、およびがレコードよりも多くフェッチすると、マーカーインデックスの増分が発生します。たとえば、クエリの場合は無効なパラメータであり、とをスローします。 k++?pstObject.setInt( 1, ...rsleaderid != 0memberid != 0pstObject.setInt( 2, ...SQLException

pstObjectwhileループで同じものを繰り返し使用しているので、pstObject.clearParameters()現在のパラメーター値をクリアするためにを使用することをお勧めします。これはオプションですが、現在のパラメータ値で使用されているリソースをすぐに解放すると便利な場合があります。

于 2012-05-16T10:03:43.767 に答える