2016-10-21 3 views
0

Я использую JdbcTemplate, чтобы сделать запрос к моей базе данных, созданной Spring Data REST. Запрошенные данные будут управляться с помощью angularJs. В цикле моего jdbc.query() Я создаю список, который должен быть возвращен, если последний ResultSet передан.JdbcTemplate return if isLast()

Но по причине того, что значение должно возвращаться за пределы условия, я должен вернуть null каждый раз, когда будет принят цикл для моего ResultSet.

Итак, есть ли способ сделать это лучше?

Заранее спасибо

Мой код:

List list = new ArrayList(); 

public List findById(Long id){ 
    return jdbc.query(
       sql, 
       new Object[]{id}, 
       (ResultSet rs, int rowNum) -> { 

      // code for building list 

      if(rs.isLast()){ 
       return list; 
      } 

      return null; 
     } 
    ) 
} 

ответ

2

1) Как я знаю, что это плохая практика, чтобы вернуть нуль. Лучше вернуть пустой список.

2) Если вам нужно перебрать результат и построить список, который вы могли бы использовать (это не то, что обычно делают люди):

return jdbcTemplate 
     .query(SELECT_ALL_USERS, new ResultSetExtractor<List<User>>() { 
     public List<User> extractData(ResultSet resultSet) 
      throws SQLException, DataAccessException 
     { 
      List<User> list = new ArrayList<User>(); 
      while (resultSet.next()) { 
      User user = new User(...); 
      list.add(user); 
      } 
      return list; 
     } 
     }); 

3) Если вы хотите сделать что-то с последним результатом нет нужно перебирать весь набор результатов, вы можете использовать

List list = new ArrayList(); 
    if(!resultSet.isBeforeFirst()){ 
    resultSet.afterLast(); 
    resultSet.previous(); 
    User user = new User; 
    list.add(user); 
    } 
    return list; 

afterLast() перемещает курсор в конец этого ResultSet объекта, только после последней строки.

previous() Перемещает курсор в предыдущую строку в этом объекте ResultSet .

isBeforeFirst возвращает true, если курсор находится перед первой строкой; ложь, если курсор находится в любой другой позиции или результирующий набор не содержит ни одной строки

Полезная ссылка: https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

Для передачи параметров в запросе можно использовать:

public User getUserByEmail(final String email) 
    { 
    return jdbcTemplate.query(SELECT_USER_BY_EMAIL, new PreparedStatementSetter() { 
     public void setValues(PreparedStatement preparedStatement) 
     throws SQLException 
     { 
     preparedStatement.setString(1, email); 
     } 
    }, new ResultSetExtractor<User>() {...} 
    }); 
    } 
+0

1. спасибо за аванс – Phil

+0

* совет 2. это решение для моей проблемы! – Phil

+0

Да, ты прав. Я использовал список из-за своей проблемы, поэтому мне не пришлось возвращать мою сущность до завершения ResultSet – Phil

Смежные вопросы