ResultSet теряет первое значение - PullRequest
0 голосов
/ 05 июня 2010

Код работает нормально, но я заметил, что когда я запрашивал строку только с одним результатом, он ничего не возвращал. Я почему-то пропускаю первый результат, думаю, но понятия не имею, почему.

    else{
   Conn con = null;
   try {
    con = new Conn();
   } catch (Exception e) {

    e.printStackTrace();
   }
   String sql = "SELECT productname, quantityperunit, unitprice FROM products pr, categories ca WHERE pr.categoryID = ca.categoryID AND ProductName LIKE '%" + searchTerm + "%'";
   System.out.println("last try");
   try {
    searchResults = con.query(sql);

    if (searchResults.next()){
     session.setAttribute("searchResults", searchResults);
    }


   } catch (Exception e) {

    e.printStackTrace();
   } 


  }

и это код дисплея:

 java.sql.ResultSet resultSet = (java.sql.ResultSet) session.getAttribute("searchResults");
    if(resultSet == null){
     out.println("Nullified");
    }
 if(resultSet!=null){
  out.println("<table border='1'>");
     out.println("<tr><th>Product Name</th><th>Quantity per Item</th><th>Price</th><th>Quantity</th><th><Add to Cart</th></tr>");
     while(resultSet.next()){      
      out.println("<tr><td>"+resultSet.getString("ProductName")+"</td></tr>");
     }
     out.println("</table>");
 }

любая помощь будет оценена.

Ответы [ 3 ]

7 голосов
/ 05 июня 2010

В соответствии с документами API для ResultSet далее :

Перемещает курсор на одну строку вперед от текущей позиции.Курсор ResultSet изначально расположен перед первой строкой;первый вызов метода next делает первую строку текущей строкой;второй вызов делает вторую строку текущей строкой и т. д.

Но в вашем коде перед входом в цикл while вы перемещаете курсор в первую строку:

searchResults = con.query(sql);
if (searchResults.next()){
    session.setAttribute("searchResults", searchResults);
}

Один из способов решения этой проблемы - изменить это:

while(resultSet.next()) {
   out.println(""+resultSet.getString("ProductName")+""); } out.println(""); 
}

на следующее:

do {
   out.println(""+resultSet.getString("ProductName")+""); } out.println("");
} while(resultSet.next());

В качестве альтернативы, если ваш драйвер JDBC поддерживает это, вы можете сделатьвызов beforeFirst() после помещения набора результатов в сеанс:

searchResults = con.query(sql);
if (searchResults.next()){
    session.setAttribute("searchResults", searchResults);
    searchResults.beforeFirst();
}

В любом случае, первая строка теряется из-за вызова searchResults.next(), когда searchResultsввод в сессию:

searchResults = con.query(sql);
if (searchResults.next()){
    session.setAttribute("searchResults", searchResults);
}
0 голосов
/ 06 мая 2019

Для тех, кто использует Spring JDBC и видит это поведение, обратите внимание, что код ResultSetExtractor выглядит следующим образом:

/**
 * Adapter to enable use of a RowCallbackHandler inside a ResultSetExtractor.
 * <p>Uses a regular ResultSet, so we have to be careful when using it:
 * We don't use it for navigating since this could lead to unpredictable consequences.
 */
private static class RowCallbackHandlerResultSetExtractor implements ResultSetExtractor<Object> {

    private final RowCallbackHandler rch;

    public RowCallbackHandlerResultSetExtractor(RowCallbackHandler rch) {
        this.rch = rch;
    }

    @Override
    public Object extractData(ResultSet rs) throws SQLException {
        while (rs.next()) {
            this.rch.processRow(rs);
        }
        return null;
    }
}

Поэтому, когда вы используете интерфейс и предоставляете лямбду для отображения строки, не повторяйте ту же ошибку, которую я сделал, и снова включите цикл while(resultSet.next()), например, иначе вы увидите, что пропускаете ряд:

// THIS IS BAD AND WILL MAKE YOU SKIP THE FIRST RESULT
new JdbcTemplate(getDataSource()).query(sql, resultSet -> {
    while(resultSet.next()) {
        myMappingFunction();
    }
});

Правильный способ - написать код, отображающий строки:

new JdbcTemplate(getDataSource()).query(sql, resultSet -> {
    myMappingFunction();
});
0 голосов
/ 05 июня 2010

Я полагаю, что resultSet.next () перемещает курсор к следующему результату, поэтому он сразу пропустит первый результат на первой итерации цикла while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...