Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (c) 2009-2016, Data Geekery GmbH (http://www.datageekery.com)
* All rights reserved.
*
* 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.Connection;
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.concurrent.CompletionStage;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.stream.Stream;
import javax.sql.DataSource;
import org.jooq.conf.Settings;
import org.jooq.exception.DataAccessException;
import org.jooq.exception.DataTypeException;
import org.jooq.exception.InvalidResultException;
import org.jooq.exception.MappingException;
import org.jooq.exception.TooManyRowsException;
import org.jooq.impl.DefaultRecordMapper;
/**
* A query that can return results. Mostly, this is a {@link Select} query used
* for a SELECT statement.
*
*
Lifecycle guarantees
Most methods in this type are based on
* {@link #fetch()}, which 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 #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}.
*
* @author Lukas Eder
*/
public interface ResultQuery extends Query, Iterable {
/**
* Return the result generated by a previous call to execute().
*
* @return The result or null if no call to execute() was done
* previously.
*/
Result getResult();
/**
* Execute the query and return the generated result.
*
* This is the same as calling {@link #execute()} and then
* {@link #getResult()}
*
* 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 #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
*/
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 #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
*/
ResultSet fetchResultSet() throws DataAccessException;
/**
* Execute the query and return the generated result.
*
* This is essentially the same as {@link #fetch()}, except that being
* declared in {@link Iterable}, this method can be used in Java 5 foreach
* statements.
*
* This is just a synonym for {@link #stream()}.
*
* @return The result.
* @throws DataAccessException if something went wrong executing the query
* @see #stream()
*/
Stream fetchStream() 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.
*
* @return The result.
* @throws DataAccessException if something went wrong executing the query
*/
Stream stream() 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 #fetchLazy(int)}
*
* 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 #fetchLazy(int)
*/
Cursor fetchLazy() 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 behaviour, this will load only
* fetchSize records from the database into memory at once. For
* more details, see also {@link Statement#setFetchSize(int)}
*
* Client code is responsible for closing the cursor after use.
*
* @return The resulting cursor.
* @throws DataAccessException if something went wrong executing the query
* @see #fetchLazy()
* @see Statement#setFetchSize(int)
* @deprecated - [#2811] - 3.3.0 - Use {@link #fetchSize(int)} and
* {@link #fetchLazy()} instead.
*/
@Deprecated
Cursor fetchLazy(int fetchSize) 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
*/
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
*/
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)}
*
* @return The result. This will never be null.
* @throws DataAccessException if something went wrong executing the query
* @see Record#get(Field, Class)
*/
List fetch(Field> field, Class extends T> 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)
*/
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
*/
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)}
*
* @return The result. This will never be null.
* @throws DataAccessException if something went wrong executing the query
* @see Record#get(int, Class)
*/
List fetch(int fieldIndex, Class extends T> 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)
*/
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
*/
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)}
*
* @return The result. This will never be null.
* @throws DataAccessException if something went wrong executing the query
* @see Record#get(String, Class)
*/
List fetch(String fieldName, Class extends T> 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)
*/
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
*/
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)}
*
* @return The result. This will never be null.
* @throws DataAccessException if something went wrong executing the query
* @see Record#get(Name, Class)
*/
List fetch(Name fieldName, Class extends T> 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)
*/
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
*/
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)}
*
* @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
*/
T fetchOne(Field> field, Class extends T> 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
*/
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
*/
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)}
*
* @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
*/
T fetchOne(int fieldIndex, Class extends T> 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
*/
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
*/
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)}
*
* @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
*/
T fetchOne(String fieldName, Class extends T> 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
*/
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
*/
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)}
*
* @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
*/
T fetchOne(Name fieldName, Class extends T> 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
*/
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
*/
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
*/
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()
*/
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
*/
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
*/
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
*/
Z fetchOneInto(Table table) 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)}
*
* @return The resulting value
* @throws DataAccessException if something went wrong executing the query
* @throws TooManyRowsException if the query returned more than one record
*/
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)}
*
* @return The resulting value
* @throws DataAccessException if something went wrong executing the query
* @throws TooManyRowsException if the query returned more than one record
*/
Optional fetchOptional(Field> field, Class extends T> 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
*/
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
*/
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)}
*
* @return The resulting value
* @throws DataAccessException if something went wrong executing the query
* @throws TooManyRowsException if the query returned more than one record
*/
Optional fetchOptional(int fieldIndex, Class extends T> 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
*/
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
*/
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)}
*
* @return The resulting value
* @throws DataAccessException if something went wrong executing the query
* @throws TooManyRowsException if the query returned more than one record
*/
Optional fetchOptional(String fieldName, Class extends T> 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
*/
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
*/
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)}
*
* @return The resulting value
* @throws DataAccessException if something went wrong executing the query
* @throws TooManyRowsException if the query returned more than one record
*/
Optional fetchOptional(Name fieldName, Class extends T> 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
*/
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
*/
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
*/
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()
*/
Optional