JOOQ: fetchMany и fetchAny
Я просматривал документацию jooq, чтобы попытаться понять, как работают fetchMany и fetchAny. Но не так много примеров и вариантов использования. Может ли кто-то показать правильное использование этих команд, как они отличаются друг от друга, а также от fetch().
1 ответ
Общая идея различных ResultQuery.fetch()
Методы изложены в руководстве:
И в частности:
Что касается вашего конкретного вопроса, я думаю, что соответствующие Javadocs могут помочь:
fetchAny()
Это выполняет запрос и возвращает не более одной результирующей записи.
Пример:
TableRecord randomRecord =
DSL.using(configuration)
.select()
.from(TABLE)
.fetchAny();
Таким образом, он будет извлекать любую запись, которую база данных возвратит первой. Аналогичный запрос будет следующий, когда вы явно ограничите количество записей в базе данных до 1:
TableRecord randomRecord =
DSL.using(configuration)
.select()
.from(TABLE)
.limit(1)
.fetchOne();
fetchMany()
Разнообразные базы данных поддерживают возврат нескольких наборов результатов из хранимых процедур. Пример Sybase ASE:
> sp_help 'author'
+--------+-----+-----------+-------------+-------------------+
|Name |Owner|Object_type|Object_status|Create_date |
+--------+-----+-----------+-------------+-------------------+
| author|dbo |user table | -- none -- |Sep 22 2011 11:20PM|
+--------+-----+-----------+-------------+-------------------+
+-------------+-------+------+----+-----+-----+
|Column_name |Type |Length|Prec|Scale|... |
+-------------+-------+------+----+-----+-----+
|id |int | 4|NULL| NULL| 0|
|first_name |varchar| 50|NULL| NULL| 1|
|last_name |varchar| 50|NULL| NULL| 0|
|date_of_birth|date | 4|NULL| NULL| 1|
|year_of_birth|int | 4|NULL| NULL| 1|
+-------------+-------+------+----+-----+-----+
При непосредственном использовании JDBC это довольно утомительно, так как вам приходится писать много кода для извлечения одного результата за другим:
ResultSet rs = statement.executeQuery();
// Repeat until there are no more result sets
for (;;) {
// Empty the current result set
while (rs.next()) {
// [ .. do something with it .. ]
}
// Get the next result set, if available
if (statement.getMoreResults()) {
rs = statement.getResultSet();
}
else {
break;
}
}
// Be sure that all result sets are closed
statement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
statement.close();
С JOOQ и fetchMany()
Это очень просто:
List<Result<Record>> results = create.fetchMany("sp_help 'author'");