diff --git a/jOOQ/src/main/java/org/jooq/DeleteResultStep.java b/jOOQ/src/main/java/org/jooq/DeleteResultStep.java
index 5f577e0a1d..033667f9fa 100644
--- a/jOOQ/src/main/java/org/jooq/DeleteResultStep.java
+++ b/jOOQ/src/main/java/org/jooq/DeleteResultStep.java
@@ -37,23 +37,6 @@
*/
package org.jooq;
-// ...
-// ...
-// ...
-import static org.jooq.SQLDialect.FIREBIRD;
-import static org.jooq.SQLDialect.MARIADB;
-// ...
-import static org.jooq.SQLDialect.POSTGRES;
-// ...
-
-import java.util.Optional;
-
-import org.jooq.exception.DataAccessException;
-import org.jooq.exception.TooManyRowsException;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
/**
* This type is used for the {@link Delete}'s DSL API.
*
@@ -93,56 +76,6 @@ import org.jetbrains.annotations.Nullable;
*
* @author Lukas Eder
*/
-public interface DeleteResultStep extends Delete {
-
- /**
- * The result holding returned values as specified by the
- * {@link DeleteReturningStep}.
- *
- * @return The returned values as specified by the
- * {@link DeleteReturningStep}. Note:
- *
- *
Not all databases / JDBC drivers support returning several
- * values on multi-row inserts!
- *
This may return an empty Result in case jOOQ
- * could not retrieve any generated keys from the JDBC driver.
- *
- * @throws DataAccessException if something went wrong executing the query
- * @see DeleteQuery#getReturnedRecords()
- */
- @NotNull
- @Support({ FIREBIRD, MARIADB, POSTGRES })
- Result fetch() throws DataAccessException;
-
- /**
- * The record holding returned values as specified by the
- * {@link DeleteReturningStep}.
- *
- * @return The returned value as specified by the
- * {@link DeleteReturningStep}. This may return null in
- * case jOOQ could not retrieve any generated keys from the JDBC
- * driver.
- * @throws DataAccessException if something went wrong executing the query
- * @throws TooManyRowsException if the query returned more than one record
- * @see DeleteQuery#getReturnedRecord()
- */
- @Nullable
- @Support({ FIREBIRD, MARIADB, POSTGRES })
- R fetchOne() throws DataAccessException, TooManyRowsException;
-
-
- /**
- * The record holding returned values as specified by the
- * {@link DeleteReturningStep}.
- *
- * @return The returned value as specified by the
- * {@link DeleteReturningStep}
- * @throws DataAccessException if something went wrong executing the query
- * @throws TooManyRowsException if the query returned more than one record
- * @see DeleteQuery#getReturnedRecord()
- */
- @NotNull
- @Support({ FIREBIRD, MARIADB, POSTGRES })
- Optional fetchOptional() throws DataAccessException, TooManyRowsException;
+public interface DeleteResultStep extends Delete, Fetchable {
}
diff --git a/jOOQ/src/main/java/org/jooq/Fetchable.java b/jOOQ/src/main/java/org/jooq/Fetchable.java
new file mode 100644
index 0000000000..916948ac33
--- /dev/null
+++ b/jOOQ/src/main/java/org/jooq/Fetchable.java
@@ -0,0 +1,4151 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Other licenses:
+ * -----------------------------------------------------------------------------
+ * Commercial licenses for this work are available. These replace the above
+ * ASL 2.0 and offer limited warranties, support, maintenance, and commercial
+ * database integrations.
+ *
+ * For more information, please visit: http://www.jooq.org/licenses
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+package org.jooq;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+import java.util.stream.Collector;
+import java.util.stream.Stream;
+
+import javax.sql.DataSource;
+
+import org.jooq.conf.Settings;
+import org.jooq.exception.DataAccessException;
+import org.jooq.exception.InvalidResultException;
+import org.jooq.exception.MappingException;
+import org.jooq.exception.NoDataFoundException;
+import org.jooq.exception.TooManyRowsException;
+import org.jooq.impl.DefaultRecordMapper;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface Fetchable extends Iterable {
+
+ /**
+ * Execute the query and return the generated result.
+ *
+ * The result and its contained records are attached to the original
+ * {@link Configuration} by default. Use {@link Settings#isAttachRecords()}
+ * to override this behaviour.
+ *
Lifecycle guarantees
This method completes the whole
+ * {@link ConnectionProvider} and {@link ExecuteListener} lifecycles,
+ * eagerly fetching all results into memory. Underlying JDBC
+ * {@link ResultSet}s are always closed. Underlying JDBC
+ * {@link PreparedStatement}s are closed, unless
+ * {@link ResultQuery#keepStatement(boolean)} is set.
+ *
+ * In order to keep open {@link ResultSet}s and fetch records lazily, use
+ * {@link #fetchLazy()} instead and then operate on {@link Cursor}.
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ Result fetch() throws DataAccessException;
+
+ /**
+ * Execute the query and return the generated result as a JDBC
+ * {@link ResultSet}.
+ *
+ * This is the same as calling {@link #fetchLazy()}.
+ * {@link Cursor#resultSet() resultSet()} and will return a
+ * {@link ResultSet} wrapping the JDBC driver's ResultSet.
+ * Closing this ResultSet may close the producing
+ * {@link Statement} or {@link PreparedStatement}, depending on your setting
+ * for {@link ResultQuery#keepStatement(boolean)}.
+ *
+ * You can use this method when you want to use jOOQ for query execution,
+ * but not for result fetching. The returned ResultSet can also
+ * be used with {@link DSLContext#fetch(ResultSet)}.
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ ResultSet fetchResultSet() throws DataAccessException;
+
+ /**
+ * Execute the query using {@link #fetch()} and return the generated result
+ * as an {@link Iterator}.
+ *
+ * {@inheritDoc}
+ */
+ @NotNull
+ @Override
+ Iterator iterator() throws DataAccessException;
+
+
+
+ /**
+ * Execute the query using {@link #fetch()} and pass all results to a
+ * consumer.
+ *
+ * This is essentially the same as {@link #fetch()}.
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ default void forEach(Consumer super R> action) {
+ Iterable.super.forEach(action);
+ }
+
+ /**
+ * Execute the query using {@link #fetch()} and return the generated result
+ * as an {@link Spliterator}.
+ *
+ * This is just a synonym for {@link #stream()}.
+ *
+ * Clients should ensure the {@link Stream} is properly closed, e.g. in a
+ * try-with-resources statement:
+ *
+ *
+ * try (Stream<R> stream = query.stream()) {
+ * // Do things with stream
+ * }
+ *
+ *
+ * If users prefer more fluent style streaming of queries, {@link ResultSet}
+ * can be registered and closed via {@link ExecuteListener}, or via "smart"
+ * third-party {@link DataSource}s.
+ *
+ * Depending on your JDBC driver's default behaviour, this may load the
+ * whole database result into the driver's memory. In order to indicate to
+ * the driver that you may not want to fetch all records at once, use
+ * {@link ResultQuery#fetchSize(int)} prior to calling this method.
+ *
+ * @return The result.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see #stream()
+ */
+ @NotNull
+ Stream fetchStream() throws DataAccessException;
+
+ /**
+ * Stream this query, mapping records into a custom type.
+ *
+ * This is the same as calling
+ * fetchStream().map(r -> r.into(type)). See
+ * {@link Record#into(Class)} for more details.
+ *
+ * Clients should ensure the {@link Stream} is properly closed, e.g. in a
+ * try-with-resources statement:
+ *
+ *
+ * try (Stream<R> stream = query.stream()) {
+ * // Do things with stream
+ * }
+ *
+ *
+ * If users prefer more fluent style streaming of queries, {@link ResultSet}
+ * can be registered and closed via {@link ExecuteListener}, or via "smart"
+ * third-party {@link DataSource}s.
+ *
+ * Depending on your JDBC driver's default behaviour, this may load the
+ * whole database result into the driver's memory. In order to indicate to
+ * the driver that you may not want to fetch all records at once, use
+ * {@link ResultQuery#fetchSize(int)} prior to calling this method.
+ *
+ * @param The generic entity type.
+ * @param type The entity type.
+ * @see Record#into(Class)
+ * @see Result#into(Class)
+ * @see DefaultRecordMapper
+ * @return The results.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws MappingException wrapping any reflection or data type conversion
+ * exception that might have occurred while mapping records
+ */
+ @NotNull
+ Stream fetchStreamInto(Class extends E> type) throws DataAccessException, MappingException;
+
+ /**
+ * Stream this query, mapping records into a custom record.
+ *
+ * This is the same as calling
+ * fetchStream().map(r -> r.into(table)). See
+ * {@link Record#into(Table)} for more details.
+ *
+ * The result and its contained records are attached to the original
+ * {@link Configuration} by default. Use {@link Settings#isAttachRecords()}
+ * to override this behaviour.
+ *
+ * Clients should ensure the {@link Stream} is properly closed, e.g. in a
+ * try-with-resources statement:
+ *
+ *
+ * try (Stream<R> stream = query.stream()) {
+ * // Do things with stream
+ * }
+ *
+ *
+ * If users prefer more fluent style streaming of queries, {@link ResultSet}
+ * can be registered and closed via {@link ExecuteListener}, or via "smart"
+ * third-party {@link DataSource}s.
+ *
+ * Depending on your JDBC driver's default behaviour, this may load the
+ * whole database result into the driver's memory. In order to indicate to
+ * the driver that you may not want to fetch all records at once, use
+ * {@link ResultQuery#fetchSize(int)} prior to calling this method.
+ *
+ * @param The generic table record type.
+ * @param table The table type.
+ * @return The results. This will never be null.
+ * @see Record#into(Table)
+ * @see Result#into(Table)
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ Stream fetchStreamInto(Table table) throws DataAccessException;
+
+ /**
+ * Stream this query.
+ *
+ * This is essentially the same as {@link #fetchLazy()} but instead of
+ * returning a {@link Cursor}, a Java 8 {@link Stream} is returned. Clients
+ * should ensure the {@link Stream} is properly closed, e.g. in a
+ * try-with-resources statement:
+ *
+ *
+ * try (Stream<R> stream = query.stream()) {
+ * // Do things with stream
+ * }
+ *
+ *
+ * If users prefer more fluent style streaming of queries, {@link ResultSet}
+ * can be registered and closed via {@link ExecuteListener}, or via "smart"
+ * third-party {@link DataSource}s.
+ *
+ * Depending on your JDBC driver's default behaviour, this may load the
+ * whole database result into the driver's memory. In order to indicate to
+ * the driver that you may not want to fetch all records at once, use
+ * {@link ResultQuery#fetchSize(int)} prior to calling this method.
+ *
+ * @return The result.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ Stream stream() throws DataAccessException;
+
+ /**
+ * Reduce the execution results of this query using a {@link Collector}.
+ *
+ * This works in the same way as calling the following code:
+ *
+ *
+ *
+ * ... with the exception of allowing client code to ignore the need for
+ * managing resources, which are handled inside of the
+ * collect() method.
+ *
+ * @param collector The collector that collects all records and accumulates
+ * them into a result type.
+ * @return The result of the collection.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ X collect(Collector super R, A, X> collector) throws DataAccessException;
+
+
+
+ /**
+ * Execute the query and "lazily" return the generated result.
+ *
+ * The returned {@link Cursor} holds a reference to the executed
+ * {@link PreparedStatement} and the associated {@link ResultSet}. Data can
+ * be fetched (or iterated over) lazily, fetching records from the
+ * {@link ResultSet} one by one.
+ *
+ * Depending on your JDBC driver's default behaviour, this may load the
+ * whole database result into the driver's memory. In order to indicate to
+ * the driver that you may not want to fetch all records at once, use
+ * {@link ResultQuery#fetchSize(int)} prior to calling this method.
+ *
+ * Client code is responsible for closing the cursor after use.
+ *
+ * @return The resulting cursor. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see ResultQuery#fetchSize(int)
+ */
+ @NotNull
+ Cursor fetchLazy() throws DataAccessException;
+
+ /**
+ * Execute a query, possibly returning several result sets.
+ *
+ * Example (Sybase ASE):
+ *
+ *
+ * String sql = "sp_help 'my_table'";
+ *
+ * The result and its contained records are attached to the original
+ * {@link Configuration} by default. Use {@link Settings#isAttachRecords()}
+ * to override this behaviour.
+ *
+ * @return The resulting records. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ Results fetchMany() throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field from the generated
+ * result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(Field)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ List fetch(Field field) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field from the generated
+ * result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(Field, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(Field, Class)
+ */
+ @NotNull
+ List fetch(Field> field, Class extends U> type) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field from the generated
+ * result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(Field, Converter)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(Field, Converter)
+ */
+ @NotNull
+ List fetch(Field field, Converter super T, ? extends U> converter) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field index from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(int)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ List> fetch(int fieldIndex) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field index from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(int, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(int, Class)
+ */
+ @NotNull
+ List fetch(int fieldIndex, Class extends U> type) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field index from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(int, Converter)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(int, Converter)
+ */
+ @NotNull
+ List fetch(int fieldIndex, Converter, ? extends U> converter) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field name from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(String)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ List> fetch(String fieldName) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field name from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(String, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(String, Class)
+ */
+ @NotNull
+ List fetch(String fieldName, Class extends U> type) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field name from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(String, Converter)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(String, Converter)
+ */
+ @NotNull
+ List fetch(String fieldName, Converter, ? extends U> converter) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field name from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(Name)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ */
+ @NotNull
+ List> fetch(Name fieldName) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field name from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(Name, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(Name, Class)
+ */
+ @NotNull
+ List fetch(Name fieldName, Class extends U> type) throws DataAccessException;
+
+ /**
+ * Execute the query and return all values for a field name from the
+ * generated result.
+ *
+ * This is the same as calling {@link #fetch()} and then
+ * {@link Result#getValues(Name, Converter)}
+ *
+ * @return The result. This will never be null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @see Record#get(Name, Converter)
+ */
+ @NotNull
+ List fetch(Name fieldName, Converter, ? extends U> converter) throws DataAccessException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(Field)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ T fetchOne(Field field) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(Field, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(Field> field, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(Field, Converter)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(Field field, Converter super T, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field index from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(int)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Object fetchOne(int fieldIndex) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field index from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(int, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(int fieldIndex, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field index from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(int, Converter)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(int fieldIndex, Converter, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(String)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Object fetchOne(String fieldName) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(String, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(String fieldName, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(String, Converter)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(String fieldName, Converter, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(Name)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Object fetchOne(Name fieldName) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a field name
+ * from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(Name, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(Name fieldName, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOne()} and then
+ * {@link Record#get(Name, Converter)}
+ *
+ * @return The resulting value or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchOne(Name fieldName, Converter, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting record.
+ *
+ * The resulting record is attached to the original {@link Configuration} by
+ * default. Use {@link Settings#isAttachRecords()} to override this
+ * behaviour.
+ *
+ * @return The resulting record or null if the query returns no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ R fetchOne() throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value into a
+ * custom mapper callback.
+ *
+ * @return The custom mapped record or null if the query returned no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ E fetchOne(RecordMapper super R, E> mapper) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting record as a name/value
+ * map.
+ *
+ * @return The resulting record or null if the query returns no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ * @see Result#intoMaps()
+ * @see Record#intoMap()
+ */
+ @Nullable
+ Map fetchOneMap() throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting record as an array
+ *
+ * You can access data like this
+ *
query.fetchOneArray()[fieldIndex]
+ *
+ * @return The resulting record or null if the query returns no
+ * records.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Object[] fetchOneArray() throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Map resulting records onto a custom type.
+ *
+ * This is the same as calling
+ * E result = null;
+ * Record r = q.fetchOne();
+ *
+ * if (r != null)
+ * result = r.into(type);
+ *
. See {@link Record#into(Class)} for more details
+ *
+ * @param The generic entity type.
+ * @param type The entity type.
+ * @return The resulting record or null if the query returns no
+ * records.
+ * @see Record#into(Class)
+ * @see Result#into(Class)
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws MappingException wrapping any reflection or data type conversion
+ * exception that might have occurred while mapping records
+ * @throws TooManyRowsException if the query returned more than one record
+ * @see DefaultRecordMapper
+ */
+ @Nullable
+ E fetchOneInto(Class extends E> type) throws DataAccessException, MappingException, TooManyRowsException;
+
+ /**
+ * Map resulting records onto a custom record.
+ *
+ * This is the same as calling
+ * Z result = null;
+ * Record r = q.fetchOne();
+ *
+ * if (r != null)
+ * result = r.into(table);
+ *
. See {@link Record#into(Table)} for more details
+ *
+ * The resulting record is attached to the original {@link Configuration} by
+ * default. Use {@link Settings#isAttachRecords()} to override this
+ * behaviour.
+ *
+ * @param The generic table record type.
+ * @param table The table type.
+ * @return The resulting record or null if the query returns no
+ * records.
+ * @see Record#into(Table)
+ * @see Result#into(Table)
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Z fetchOneInto(Table table) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field from
+ * the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(Field)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ T fetchSingle(Field field) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field from
+ * the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(Field, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(Field> field, Class extends U> type) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field from
+ * the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(Field, Converter)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(Field field, Converter super T, ? extends U> converter) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field
+ * index from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(int)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Object fetchSingle(int fieldIndex) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field
+ * index from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(int, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(int fieldIndex, Class extends U> type) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field
+ * index from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(int, Converter)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(int fieldIndex, Converter, ? extends U> converter) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field name
+ * from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(String)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Object fetchSingle(String fieldName) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field name
+ * from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(String, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(String fieldName, Class extends U> type) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field name
+ * from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(String, Converter)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(String fieldName, Converter, ? extends U> converter) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field name
+ * from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(Name)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ Object fetchSingle(Name fieldName) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field name
+ * from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(Name, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(Name fieldName, Class extends U> type) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value for a field name
+ * from the generated result.
+ *
+ * This is the same as calling {@link #fetchSingle()} and then
+ * {@link Record#get(Name, Converter)}
+ *
+ * @return The resulting value. Unlike other {@link #fetchSingle()} methods,
+ * which never produce null records, this can be null
+ * if the resulting value in the record is null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @Nullable
+ U fetchSingle(Name fieldName, Converter, ? extends U> converter) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting record.
+ *
+ * The resulting record is attached to the original {@link Configuration} by
+ * default. Use {@link Settings#isAttachRecords()} to override this
+ * behaviour.
+ *
+ * @return The resulting value. This is never null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ R fetchSingle() throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting value into a custom
+ * mapper callback.
+ *
+ * @return The resulting value. This is never null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ E fetchSingle(RecordMapper super R, E> mapper) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting record as a name/value
+ * map.
+ *
+ * @return The resulting value. This is never null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ * @see Result#intoMaps()
+ * @see Record#intoMap()
+ */
+ @NotNull
+ Map fetchSingleMap() throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Execute the query and return exactly one resulting record as an array
+ *
+ * You can access data like this
+ *
query.fetchSingleArray()[fieldIndex]
+ *
+ * @return The resulting value. This is never null.
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Object[] fetchSingleArray() throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Map resulting records onto a custom type.
+ *
+ * This is the same as calling
+ * E result = null;
+ * Record r = q.fetchSingle();
+ *
+ * if (r != null)
+ * result = r.into(type);
+ *
. See {@link Record#into(Class)} for more details
+ *
+ * @param The generic entity type.
+ * @param type The entity type.
+ * @return The resulting value.
+ * @see Record#into(Class)
+ * @see Result#into(Class)
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws MappingException wrapping any reflection or data type conversion
+ * exception that might have occurred while mapping records
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ * @see DefaultRecordMapper
+ */
+ // [#10774] This is @Nullable in rare cases, which can be annoying for Kotlin users in most cases
+ E fetchSingleInto(Class extends E> type) throws DataAccessException, MappingException, NoDataFoundException, TooManyRowsException;
+
+ /**
+ * Map resulting records onto a custom record.
+ *
+ * This is the same as calling
+ * Z result = null;
+ * Record r = q.fetchSingle();
+ *
+ * if (r != null)
+ * result = r.into(table);
+ *
. See {@link Record#into(Table)} for more details
+ *
+ * The resulting record is attached to the original {@link Configuration} by
+ * default. Use {@link Settings#isAttachRecords()} to override this
+ * behaviour.
+ *
+ * @param The generic table record type.
+ * @param table The table type.
+ * @return The resulting value. This is never null.
+ * @see Record#into(Table)
+ * @see Result#into(Table)
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws NoDataFoundException if the query returned no records
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Z fetchSingleInto(Table table) throws DataAccessException, NoDataFoundException, TooManyRowsException;
+
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(Field)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(Field field) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(Field, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(Field> field, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(Field, Converter)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(Field field, Converter super T, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field index from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(int)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional> fetchOptional(int fieldIndex) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field index from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(int, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(int fieldIndex, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field index from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(int, Converter)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(int fieldIndex, Converter, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(String)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional> fetchOptional(String fieldName) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(String, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(String fieldName, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(String, Converter)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(String fieldName, Converter, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(Name)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional> fetchOptional(Name fieldName) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(Name, Class)}
+ *
+ * The {@link Converter} that is provided by
+ * {@link Configuration#converterProvider()} will be used to convert the
+ * value to U
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(Name fieldName, Class extends U> type) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value for a
+ * field name from the generated result.
+ *
+ * This is the same as calling {@link #fetchOptional()} and then
+ * {@link Record#get(Name, Converter)}
+ *
+ * @return The resulting value
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(Name fieldName, Converter, ? extends U> converter) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting record.
+ *
+ * The resulting record is attached to the original {@link Configuration} by
+ * default. Use {@link Settings#isAttachRecords()} to override this
+ * behaviour.
+ *
+ * @return The resulting record
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional() throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting value into a
+ * custom mapper callback.
+ *
+ * @return The custom mapped record
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ */
+ @NotNull
+ Optional fetchOptional(RecordMapper super R, E> mapper) throws DataAccessException, TooManyRowsException;
+
+ /**
+ * Execute the query and return at most one resulting record as a name/value
+ * map.
+ *
+ * @return The resulting record
+ * @throws DataAccessException if something went wrong executing the query
+ * @throws TooManyRowsException if the query returned more than one record
+ * @see Result#intoMaps()
+ * @see Record#intoMap()
+ */
+ @NotNull
+ Optional