Я собираю List, внутри кооторого лежит куча объектов с пустыми полями, Java, JDBC
У меня есть база данных библиотеки, там существует 2 таблицы, таблица читателей и книг. Мне нужно вывести читателя и напротив него вывести список книг, которые он взял в библиотеке, или вывести, что он вовсе не взял книги. У меня есть соответствующий метод в ДАО, где я создаю запрос в базу данных(использую jdbc), пытаюсь хранить соответствующие значения в коллекции Map<Reader, List> map = new HashMap<>(); Так вот, проблема заключается в том, что в некоторых случаях я собираю List, внутри которого лежит куча объектов с пустыми полями. И я не могу проверить список на if(books == null) или так if (books.isEmpty()), чтобы вывести напротив читателя, что у него нету книг ссылка на метод, называется findAllWithBooks(): https://pastebin.com/yCPg9PHR и там я ещё добавил код из класса Book и Menu(это из presentation layer-a)
@Override
public Map<Reader, List<Book>> findAllWithBooks() {
var selectAllReadersWithBooks =
"""
SELECT reader.id, reader.name, book.name AS bookName, book.author AS authorName
FROM reader LEFT JOIN book ON reader.id = book.reader_id
""";
try (var connection = DBUtil.getConnection();
var selectAllReadersWithBooksStatement = connection.createStatement()) {
var resultSet = selectAllReadersWithBooksStatement.executeQuery(selectAllReadersWithBooks);
Map<Reader, List<Book>> map = new HashMap<>();
while (resultSet.next()) {
var book = new Book(resultSet.getString("bookName"), resultSet.getString("authorName"));
map.computeIfAbsent(mapResultSetToReader(resultSet), k -> new ArrayList<>()).add(book);
}
return map;
} catch (SQLException e) {
throw new DaoOperationException("Error finding readers with borrowed books list!");
}
}
Ответы (1 шт):
Так как для конкретного читателя может не быть ни одной книги, то нужно это проверять. Это как раз причина того, что поля книги null.
@Override
public Map<Reader, List<Book>> findAllWithBooks() {
var selectAllReadersWithBooks =
"""
SELECT reader.id, reader.name, book.id AS bookId, book.name AS bookName, book.author AS authorName
FROM reader LEFT JOIN book ON reader.id = book.reader_id
""";
try (var connection = DBUtil.getConnection();
var selectAllReadersWithBooksStatement = connection.createStatement()) {
var resultSet = selectAllReadersWithBooksStatement.executeQuery(selectAllReadersWithBooks);
Map<Reader, List<Book>> map = new HashMap<>();
while (resultSet.next()) {
Book book = null;
if (resultSet.getInt("bookId") != null) {
book = new Book(
resultSet.getString("bookName"),
resultSet.getString("authorName")
);
}
var books = map.computeIfAbsent(mapResultSetToReader(resultSet), k -> new ArrayList<>());
if (book != null) {
books.add(book);
}
}
return map;
} catch (SQLException e) {
throw new DaoOperationException("Error finding readers with borrowed books list!");
}
}
Теперь у читателя, у которого нет книг список будет пустой и можно делать проверку if (books.isEmpty())
.