You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Да, конечно! Вы можете добавить в `SchemaAwareNamedParameterJdbcTemplate` два метода: один для получения **одиночного объекта**, другой для **списка объектов**. Это обеспечит гибкость и безопасность типов. Давайте реализуем оба варианта.
2
+
3
+
---
4
+
5
+
### 1. Добавление методов в `SchemaAwareNamedParameterJdbcTemplate`
6
+
7
+
Модифицируем класс, чтобы он поддерживал оба сценария:
8
+
9
+
```java
10
+
public class SchemaAwareNamedParameterJdbcTemplate {
11
+
12
+
// ... существующие поля и конструкторы ...
13
+
14
+
/**
15
+
* Возвращает один объект из запроса.
16
+
*/
17
+
public <T> T queryForObjectWithSchema(
18
+
String schemaName,
19
+
String sql,
20
+
Map<String, Object> params,
21
+
RowMapper<T> rowMapper
22
+
) {
23
+
try {
24
+
jdbcTemplate.execute("SET LOCAL search_path TO " + sanitizeSchemaName(schemaName));
public class AllUsersFetcher extends AbstractListFetchedData<User> {
171
+
@Override
172
+
protected User typeConverter(String baseData) {
173
+
return null; // Если параметр не нужен (например, запрос SELECT * FROM users)
174
+
}
175
+
176
+
@Override
177
+
protected RowMapper<User> getObjectMapper() {
178
+
return (rs, rowNum) -> new User(rs.getString("name"));
179
+
}
180
+
}
181
+
182
+
// Использование:
183
+
AllUsersFetcher fetcher = new AllUsersFetcher(template, "SELECT * FROM users");
184
+
fetcher.fetchFromDatabase();
185
+
List<User> users = fetcher.getFetchedData(); // Список
186
+
```
187
+
188
+
---
189
+
190
+
### Итоги:
191
+
1. **Два метода в `SchemaAwareNamedParameterJdbcTemplate`**:
192
+
- `queryForObjectWithSchema()` — для одиночных объектов.
193
+
- `queryForListWithSchema()` — для списков.
194
+
195
+
2. **Два абстрактных класса**:
196
+
- `AbstractFetchedData<T>` — для случаев, когда запрос возвращает **один объект**.
197
+
- `AbstractListFetchedData<T>` — для случаев, когда запрос возвращает **список**.
198
+
199
+
3. **Безопасность типов**:
200
+
- Больше не требуется приведение типов вручную.
201
+
- Ошибки несоответствия типов будут пойманы на этапе компиляции.
202
+
203
+
---
204
+
205
+
### Когда что использовать:
206
+
- **`AbstractFetchedData<T>`** — для запросов с `WHERE` (например, поиск по уникальному идентификатору).
207
+
- **`AbstractListFetchedData<T>`** — для запросов, возвращающих множество строк (например, `SELECT * FROM table`).
208
+
209
+
Если вы хотите объединить оба варианта в одном классе, можно добавить параметр, указывающий тип результата (например, через `enum`), но это усложнит код. Лучше разделить логику на два класса для ясности.
0 commit comments