0

クエリで limit 関数を使用して MYSql データベースからレコードを取得しようとすると、Java でこの奇妙な問題が発生します。何が間違っていたのか、何が間違っていたのかわからないので、このクエリには苦労しています。

問題 - Java プログラムでこのクエリを実行すると、すべてのレコードが返され、制限で指定されているようにレコードが 10 に制限されません。

同じクエリを MYSql コマンド ラインで実行すると、非常にうまく実行され、10 個のレコードしかフェッチされません。

以下は、Java コードとクエリです。任意のヘルプまたはサポートをいただければ幸いです。

Java コード -

public UserVO getApplUserDetailsList(UserVO userVO) throws CAPDAOException {

     List<UserVO> returnList = null;
     String methodName = "getApplUserDetails()";
     Session session = null;
     String queryString = null;
     Transaction transaction = null;
     PreparedStatement ps = null;
     ResultSet rs = null;

     if(userVO == null)
     {
         logger.writeToTivoliAlertLog(className, CAPConstants.ERROR, methodName, null, "userVO returned null. Busines validation error.!", null);
         throw new CAPDAOException("userVO returned null. Busines validation error.!",CAPException.BUSINESS_VALIDATION_ERROR_SECURITY);
     }

      try {

         returnList = new ArrayList<UserVO>();

         System.out.println("");
         String appusr = userVO.getAppUsrNm(); 
         session = getSession();
         transaction = session.beginTransaction();

          if(userVO.getAppUsrRoleCd()!=null && !userVO.getAppUsrRoleCd().trim().equalsIgnoreCase(CAPConstants.DEFAULT_DROPDOWN_VALUE)){

              queryString = "SELECT " +
                                "APPL_USR_ID,APPL_USR_NM,APPL_USR_FRST_NM, " +
                                "APPL_USR_LST_NM,ACCESS_ROLE_CD " +
                                "FROM APPL_USR " +
                                "WHERE " +
                                "APPL_USR_NM LIKE ?"+
                                " AND APPL_USR_FRST_NM LIKE ?"+
                                " AND APPL_USR_LST_NM LIKE ?"+
                                " AND ACCESS_ROLE_CD = ?"+
                                " AND APPL_USR_ID != ?";

                ps = session.connection().prepareStatement(queryString);

                ps.setString(1,userVO.getAppUsrNm()+CAPConstants.PERCENTILE_SYMBOL);
                ps.setString(2,userVO.getAppUsrFirstNm()+CAPConstants.PERCENTILE_SYMBOL);
                ps.setString(3,userVO.getAppUsrLastNm()+CAPConstants.PERCENTILE_SYMBOL);
                ps.setString(4,userVO.getAppUsrRoleCd());
                ps.setInt(5, 1);

          }
          else
          {
              queryString = "SELECT " +
                        "APPL_USR_ID,APPL_USR_NM,APPL_USR_FRST_NM, " +
                        "APPL_USR_LST_NM,ACCESS_ROLE_CD " +
                        "FROM APPL_USR " +
                        "WHERE " +
                        "APPL_USR_NM LIKE ?"+
                        " AND APPL_USR_FRST_NM LIKE ?"+
                        " AND APPL_USR_LST_NM LIKE ?"+
                        " AND APPL_USR_ID != ?";

        ps = session.connection().prepareStatement(queryString);

        ps.setString(1,userVO.getAppUsrNm()+CAPConstants.PERCENTILE_SYMBOL);
        ps.setString(2,userVO.getAppUsrFirstNm()+CAPConstants.PERCENTILE_SYMBOL);
        ps.setString(3,userVO.getAppUsrLastNm()+CAPConstants.PERCENTILE_SYMBOL);
        ps.setInt(4, 1);

          }

          if(userVO.getQueryAction()!=null && userVO.getQueryAction().equals(CAPConstants.GET_DATA))
          queryString += " ORDER BY APPL_USR_ID LIMIT " + userVO.getPAGE_MIN_LIMIT() + ", " + userVO.getPAGE_MAX_LIMIT();
          else
              queryString += " ORDER BY APPL_USR_ID";

         rs = ps.executeQuery();

         if(userVO.getQueryAction()!=null &&         userVO.getQueryAction().equals(CAPConstants.GET_DATA))
         {

            int tempCOunt = 0;

             while(rs!=null && rs.next())
             {
                 tempCOunt ++;

                 UserVO returnVO = new UserVO();

                 returnVO.setAppUsrId(rs.getInt("APPL_USR_ID"));
                 returnVO.setAppUsrNm(rs.getString("APPL_USR_NM"));
                 returnVO.setAppUsrFirstNm(rs.getString("APPL_USR_FRST_NM"));
                 returnVO.setAppUsrLastNm(rs.getString("APPL_USR_LST_NM"));

                 if (rs.getString("ACCESS_ROLE_CD")!=null && rs.getString("ACCESS_ROLE_CD").trim().equalsIgnoreCase(CAPConstants.ADMINISTRATOR_ROLE_CD))
                         returnVO.setApplicationLevelRole("Administrator");
                 else if (rs.getString("ACCESS_ROLE_CD")!=null && rs.getString("ACCESS_ROLE_CD").trim().equalsIgnoreCase(CAPConstants.MAINTAINER_ROLE_CD))
                     returnVO.setApplicationLevelRole("Maintainer");
                 else if (rs.getString("ACCESS_ROLE_CD")!=null && rs.getString("ACCESS_ROLE_CD").trim().equalsIgnoreCase(CAPConstants.VIEWER_ROLE_CD))
                     returnVO.setApplicationLevelRole("Viewer");
                 else
                     returnVO.setApplicationLevelRole("None");

                 returnList.add(returnVO);

             }

             System.out.println("Count >>>>>>>>>>>>>>>>>>> "+tempCOunt);

             userVO.setReturnListFromDB(returnList);
         }
         else
         {

            int rowcount = 0;
            if (rs.last()) {
              rowcount = rs.getRow();
              rs.beforeFirst(); // not rs.first() because the rs.next() below will move on, missing the first element
            }

            userVO.setTotalRecordCount(rowcount);

            System.out.println("Total count of the records to be used for pagination >> "+rowcount);

            rowcount = 0;

             while(rs!=null && rs.next())
             {
                 rowcount ++;
                 UserVO returnVO = new UserVO();

                 returnVO.setAppUsrId(rs.getInt("APPL_USR_ID"));
                 returnVO.setAppUsrNm(rs.getString("APPL_USR_NM"));
                 returnVO.setAppUsrFirstNm(rs.getString("APPL_USR_FRST_NM"));
                 returnVO.setAppUsrLastNm(rs.getString("APPL_USR_LST_NM"));

                 if (rs.getString("ACCESS_ROLE_CD")!=null && rs.getString("ACCESS_ROLE_CD").trim().equalsIgnoreCase(CAPConstants.ADMINISTRATOR_ROLE_CD))
                         returnVO.setApplicationLevelRole("Administrator");
                 else if (rs.getString("ACCESS_ROLE_CD")!=null && rs.getString("ACCESS_ROLE_CD").trim().equalsIgnoreCase(CAPConstants.MAINTAINER_ROLE_CD))
                     returnVO.setApplicationLevelRole("Maintainer");
                 else if (rs.getString("ACCESS_ROLE_CD")!=null && rs.getString("ACCESS_ROLE_CD").trim().equalsIgnoreCase(CAPConstants.VIEWER_ROLE_CD))
                     returnVO.setApplicationLevelRole("Viewer");
                 else
                     returnVO.setApplicationLevelRole("None");

                 returnList.add(returnVO);

                 System.out.println("Row count >>"+rowcount);

                 if(rowcount == CAPConstants.PAGINATION_MAX_VALUE)
                     break;

             }

             rowcount = 0;

             userVO.setReturnListFromDB(returnList);

         }



         System.out.println("returnList >>"+returnList);


         return userVO;

       } catch (Throwable e) {
           e.printStackTrace();
            logger.writeToTivoliAlertLog(className, CAPConstants.ERROR, methodName, userVO.getAppUsrNm(), "Error occured while trying to fetch application user details. Printing stack trace to the log for analysis..", e);
            throw new CAPDAOException("Error occured while trying to fetch application user details.",CAPException.SPEXECUTION_ERROR_CODE);

       }
      finally{

          closeTransactionAndSession(session,transaction);

      }

}

MYSQL クエリ -

SELECT APPL_USR_ID,APPL_USR_NM,APPL_USR_FRST_NM, APPL_USR_LST_NM,ACCESS_ROLE_CD 
FROM APPL_USR WHERE APPL_USR_NM LIKE '%' 
       AND APPL_USR_FRST_NM LIKE '%' 
       AND APPL_USR_LST_NM LIKE '%' 
       AND APPL_USR_ID != 1 
ORDER BY APPL_USR_ID 
LIMIT 10, 10
4

2 に答える 2

4

後に LIMIT を追加します

ps = session.connection().prepareStatement(queryString);

だから電話するとき

rs = ps.executeQuery();

LIMIT はありません。

そのため、queryStringの構築が完了したら、 prepareStatementを呼び出します。

于 2012-06-28T09:13:54.400 に答える
0

文字列を使用してステートメントを準備した後、クエリ文字列を変更しています。

于 2012-06-28T09:17:36.820 に答える