DAO layer (builder with JOIN request). Как написать метод в DAO layer по запросу всех строк из таблицы?
Всем привет! Пишу своё первое web-app на servlet, jsp. Столкнулся с проблемой, которую попытаюсь максимально подробно описать ниже, суть которой состоит в том, что я не понимаю как из resultset достать некоторые поля. Собственно ниже приведен код с описанеим: Мой объект:
public class Guitar {
private Integer id;
private Fabric fabric;
private String name;
private Short strings;
private String color;
private Integer count;
}
Помимо прочих одно из полей является объект другого класса (Fabric fabric. У это класса три поля: id, name, country). По запросу в базе данных (у Guitar \ Fabric свои таблицы в базе данных соответственно с идентичными полями и типами):
SELECT g.id as g_id, f.name as f_name, f.country as f_country, g.name as g_name, g.strings as g_strings, g.color as g_color, g.count as g_count
FROM shop_storage.guitar g
JOIN fabric f on g.fabric_id = f.id
WHERE g.id = 11;
получаемый результат я и хочу отобразить на front-end части. В DAO layer:
public Optional<Guitar> getById(Integer id) {
Guitar guitar = null;
try (Connection connection = ConnectionManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(GET_BY_ID)) {
preparedStatement.setInt(1, id);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
while (guitar == null) {
guitar = Guitar.builder()
.id(resultSet.getInt("g_id"))
.name(resultSet.getString("g_name"))
.strings(resultSet.getShort("g_strings"))
.color(resultSet.getString("g_color"))
.count(resultSet.getInt("g_count"))
.build();
}
}
} catch (SQLException e) {
throw new DaoException(e);
}
return Optional.ofNullable(guitar);
}
из resultset я могу достать поля только объекта Guitar, но вот два других, указанных в SELECT запросе (f_name, f_country) как достать - я не знаю. Возможно проблем в знаниях работы builder'a с JOIN запросом. В общем я в тупике :( p.s. чтуь не забыл, вот так выглядит мой запрос в DAO:
private static final String GET_BY_ID = "SELECT g.id as g_id, " +
"f.name as f_name, " +
"f.country as f_country, " +
"g.name as g_name, " +
"g.strings as g_strings, " +
"g.color as g_color, " +
"g.count as g_count " +
"FROM shop_storage.guitar g " +
"JOIN shop_storage.fabric f " +
"ON g.fabric_id = f.id " +
"WHERE g.id = ?";
Ответы (1 шт):
Точно так же:
resultSet.getString("f_name")
Добавить эти поля в класс Guitar.
И я бы не стал в данном случае использовать паттерн Builder: лучше передавать все параметры через конструктор.