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'");
Другие вопросы по тегам