All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jooq.ResultQuery Maven / Gradle / Ivy

There is a newer version: 3.19.11
Show newest version
/**
 * 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. *

* {@inheritDoc} */ @Override Iterator iterator() throws DataAccessException; /** * Stream this query. *

* 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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> fetchOptionalMap() throws DataAccessException, TooManyRowsException; /** * Execute the query and return at most one resulting record as an array. * * @return The resulting record * @throws DataAccessException if something went wrong executing the query * @throws TooManyRowsException if the query returned more than one record */ Optional fetchOptionalArray() throws DataAccessException, TooManyRowsException; /** * Map resulting records onto a custom type. *

* This is the same as calling

     * Optional<E> result = q.fetchOptional().map(r -> 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 * @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 */ Optional fetchOptionalInto(Class type) throws DataAccessException, MappingException, TooManyRowsException; /** * Map resulting records onto a custom record. *

* This is the same as calling

     * Optional<Z> result = q.fetchOptional().map(r -> 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 * @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 */ Optional fetchOptionalInto(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 #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 */ T fetchAny(Field field) 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, Class)} * * @return The resulting value or null if the query returned no * records. * @throws DataAccessException if something went wrong executing the query */ T fetchAny(Field field, Class type) 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, Converter)} * * @return The resulting value or null if the query returned no * records. * @throws DataAccessException if something went wrong executing the query */ U fetchAny(Field field, Converter converter) throws DataAccessException; /** * 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 */ Object fetchAny(int fieldIndex) throws DataAccessException; /** * 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 */ T fetchAny(int fieldIndex, Class type) throws DataAccessException; /** * 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 */ U fetchAny(int fieldIndex, Converter converter) throws DataAccessException; /** * 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 */ Object fetchAny(String fieldName) throws DataAccessException; /** * 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 */ T fetchAny(String fieldName, Class type) throws DataAccessException; /** * 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 */ U fetchAny(String fieldName, Converter converter) throws DataAccessException; /** * 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 */ Object fetchAny(Name fieldName) throws DataAccessException; /** * 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 */ T fetchAny(Name fieldName, Class type) throws DataAccessException; /** * 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 */ U fetchAny(Name fieldName, Converter converter) throws DataAccessException; /** * 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 first resulting record or null if the query * returns no records. * @throws DataAccessException if something went wrong executing the query */ R fetchAny() throws DataAccessException; /** * 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 first resulting record or null if the query * returns no records. * @throws DataAccessException if something went wrong executing the query */ E fetchAny(RecordMapper mapper) throws DataAccessException; /** * 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 * @see Result#intoMaps() * @see Record#intoMap() */ Map fetchAnyMap() throws DataAccessException; /** * Execute the query and return at most one resulting record as an array *

* You can access data like this *

query.fetchAnyArray()[fieldIndex]
* * @return The resulting record or null if the query returns no * records. * @throws DataAccessException if something went wrong executing the query */ Object[] fetchAnyArray() throws DataAccessException; /** * Map resulting records onto a custom type. *

* This is the same as calling

     * E result = null;
     * Record r = q.fetchAny();
     *
     * 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 * @see DefaultRecordMapper */ E fetchAnyInto(Class type) throws DataAccessException, MappingException; /** * 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 */ Z fetchAnyInto(Table table) throws DataAccessException; /** * Execute the query and return the generated result as a list of name/value * maps. * * @return The result. This will never be null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMaps() * @see Record#intoMap() */ List> fetchMaps() throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and the corresponding records as value. *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(Field)} instead, if your keys are * non-unique *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param The key's generic field type * @param key The key field. Client code must assure that this field is * unique in the result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(Field) */ Map fetchMap(Field key) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and the corresponding records as value. *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(int)} instead, if your keys are * non-unique *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param keyFieldIndex The key field. Client code must assure that this * field is unique in the result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(int) */ Map fetchMap(int keyFieldIndex) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and the corresponding records as value. *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(String)} instead, if your keys are * non-unique *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param keyFieldName The key field. Client code must assure that this * field is unique in the result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(String) */ Map fetchMap(String keyFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and the corresponding records as value. *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(Name)} instead, if your keys are * non-unique *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param keyFieldName The key field. Client code must assure that this * field is unique in the result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(Name) */ Map fetchMap(Name keyFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(Field, Field)} instead, if your keys * are non-unique * * @param The key's generic field type * @param The value's generic field type * @param key The key field. Client code must assure that this field is * unique in the result set. * @param value The value field * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(Field, Field) */ Map fetchMap(Field key, Field value) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(int, int)} instead, if your keys are * non-unique * * @param keyFieldIndex The key field. Client code must assure that this * field is unique in the result set. * @param valueFieldIndex The value field * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(int, int) */ Map fetchMap(int keyFieldIndex, int valueFieldIndex) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(String, String)} instead, if your keys * are non-unique * * @param keyFieldName The key field. Client code must assure that this * field is unique in the result set. * @param valueFieldName The value field * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(String, String) */ Map fetchMap(String keyFieldName, String valueFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* An exception is thrown, if the key turns out to be non-unique in the * result set. Use {@link #fetchGroups(Name, Name)} instead, if your keys * are non-unique * * @param keyFieldName The key field. Client code must assure that this * field is unique in the result set. * @param valueFieldName The value field * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key field returned two or more * equal values from the result set. * @see Result#intoMap(Name, Name) */ Map fetchMap(Name keyFieldName, Name valueFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with keys as a map key and the * corresponding record as value. *

* An exception is thrown, if the keys turn out to be non-unique in the * result set. Use {@link #fetchGroups(Field[])} instead, if your keys are * non-unique. * * @param keys The keys. Client code must assure that keys are unique in the * result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(Field[]) */ Map fetchMap(Field[] keys) throws DataAccessException; /** * Execute the query and return a {@link Map} with keys as a map key and the * corresponding record as value. *

* An exception is thrown, if the keys turn out to be non-unique in the * result set. Use {@link #fetchGroups(int[])} instead, if your keys are * non-unique. * * @param keyFieldIndexes The keys. Client code must assure that keys are * unique in the result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(int[]) */ Map fetchMap(int[] keyFieldIndexes) throws DataAccessException; /** * Execute the query and return a {@link Map} with keys as a map key and the * corresponding record as value. *

* An exception is thrown, if the keys turn out to be non-unique in the * result set. Use {@link #fetchGroups(String[])} instead, if your keys are * non-unique. * * @param keyFieldNames The keys. Client code must assure that keys are * unique in the result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(String[]) */ Map fetchMap(String[] keyFieldNames) throws DataAccessException; /** * Execute the query and return a {@link Map} with keys as a map key and the * corresponding record as value. *

* An exception is thrown, if the keys turn out to be non-unique in the * result set. Use {@link #fetchGroups(Name[])} instead, if your keys are * non-unique. * * @param keyFieldNames The keys. Client code must assure that keys are * unique in the result set. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(Name[]) */ Map fetchMap(Name[] keyFieldNames) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Field[], Class)} instead, if * your keys are non-unique. * * @param keys The keys. Client code must assure that keys are unique in the * result set. If this is null or an empty array, * the resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(Field[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(Field[] keys, Class type) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(int[], Class)} instead, if * your keys are non-unique. * * @param keyFieldIndexes The keys. Client code must assure that keys are * unique in the result set. If this is null or an * empty array, the resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(int[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(int[] keyFieldIndexes, Class type) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(String[], Class)} instead, if * your keys are non-unique. * * @param keyFieldNames The keys. Client code must assure that keys are * unique in the result set. If this is null or an * empty array, the resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(String[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(String[] keyFieldNames, Class type) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Name[], Class)} instead, if * your keys are non-unique. * * @param keyFieldNames The keys. Client code must assure that keys are * unique in the result set. If this is null or an * empty array, the resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(Name[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(Name[] keyFieldNames, Class type) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Field[], RecordMapper)} * instead, if your keys are non-unique. * * @param keys The keys. Client code must assure that keys are unique in the * result set. If this is null or an empty array, * the resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(Field[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(Field[] keys, RecordMapper mapper) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(int[], RecordMapper)} instead, * if your keys are non-unique. * * @param keyFieldIndexes The keys. Client code must assure that keys are * unique in the result set. If this is null or an * empty array, the resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(int[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(int[] keyFieldIndexes, RecordMapper mapper) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(String[], RecordMapper)} * instead, if your keys are non-unique. * * @param keyFieldNames The keys. Client code must assure that keys are * unique in the result set. If this is null or an * empty array, the resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(String[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(String[] keyFieldNames, RecordMapper mapper) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Name[], RecordMapper)} * instead, if your keys are non-unique. * * @param keyFieldNames The keys. Client code must assure that keys are * unique in the result set. If this is null or an * empty array, the resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(Name[], Class) * @see DefaultRecordMapper */ Map, E> fetchMap(Name[] keyFieldNames, RecordMapper mapper) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Class)} instead, if your keys * are non-unique. * * @param keyType The key type. If this is null, the resulting * map will contain at most one entry. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(Class) * @see DefaultRecordMapper */ Map fetchMap(Class keyType) throws DataAccessException, MappingException, InvalidResultException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Class, Class)} instead, if * your keys are non-unique. * * @param keyType The key type. If this is null, the resulting * map will contain at most one entry. * @param valueType The value type. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(Class, Class) * @see DefaultRecordMapper */ Map fetchMap(Class keyType, Class valueType) throws DataAccessException, MappingException, InvalidResultException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Class, RecordMapper)} instead, * if your keys are non-unique. * * @param keyType The key type. If this is null, the resulting * map will contain at most one entry. * @param valueMapper The value mapper. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(Class, RecordMapper) * @see DefaultRecordMapper */ Map fetchMap(Class keyType, RecordMapper valueMapper) throws DataAccessException, InvalidResultException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(RecordMapper)} instead, if * your keys are non-unique. * * @param keyMapper The key mapper. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(RecordMapper) * @see DefaultRecordMapper */ Map fetchMap(RecordMapper keyMapper) throws DataAccessException, InvalidResultException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(RecordMapper, Class)} instead, * if your keys are non-unique. * * @param keyMapper The key mapper. * @param valueType The value type. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(RecordMapper, Class) * @see DefaultRecordMapper */ Map fetchMap(RecordMapper keyMapper, Class valueType) throws DataAccessException, InvalidResultException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(RecordMapper, RecordMapper)} * instead, if your keys are non-unique. * * @param keyMapper The key mapper. * @param valueMapper The value mapper. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(RecordMapper, RecordMapper) * @see DefaultRecordMapper */ Map fetchMap(RecordMapper keyMapper, RecordMapper valueMapper) throws DataAccessException, InvalidResultException, MappingException; /** * Execute the query and return a {@link Map} with table as a map key and * the corresponding record as value. *

* An {@link InvalidResultException} is thrown, if the keys turn out to be * non-unique in the result set. Use {@link #fetchGroups(Table)} instead, if * your keys are non-unique. * * @param table The key table. Client code must assure that keys are unique * in the result set. May not be null. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key list is non-unique in the * result set. * @see Result#intoMap(Table) */ Map fetchMap(Table table) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given table and mapped into the given entity type. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Table, Class)} instead, if * your keys are non-unique. * * @param table The key table. Client code must assure that keys are unique * in the result set. May not be null. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(Table, Class) * @see DefaultRecordMapper */ Map fetchMap(Table table, Class type) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given table and mapped by the given mapper. *

* An {@link InvalidResultException} is thrown, if the keys are non-unique * in the result set. Use {@link #fetchGroups(Table, RecordMapper)} instead, * if your keys are non-unique. * * @param table The key table. Client code must assure that keys are unique * in the result set. May not be null. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the keys are non-unique in the result * set. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see Result#intoMap(Table, Class) * @see DefaultRecordMapper */ Map fetchMap(Table table, RecordMapper mapper) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped into the given entity type. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(Field, Class)} instead, if your key * is non-unique. * * @param key The key. Client code must assure that key is unique in the * result set. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(Field, Class) */ Map fetchMap(Field key, Class type) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped into the given entity type. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(int, Class)} instead, if your key * is non-unique. * * @param keyFieldIndex The key. Client code must assure that key is unique * in the result set. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(int, Class) */ Map fetchMap(int keyFieldIndex, Class type) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped into the given entity type. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(String, Class)} instead, if your key * is non-unique. * * @param keyFieldName The key. Client code must assure that key is unique * in the result set. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(String, Class) */ Map fetchMap(String keyFieldName, Class type) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped into the given entity type. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(Name, Class)} instead, if your key * is non-unique. * * @param keyFieldName The key. Client code must assure that key is unique * in the result set. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(Name, Class) */ Map fetchMap(Name keyFieldName, Class type) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped by the given mapper. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(Field, Class)} instead, if your key * is non-unique. * * @param key The key. Client code must assure that key is unique in the * result set. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(Field, Class) */ Map fetchMap(Field key, RecordMapper mapper) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped by the given mapper. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(int, Class)} instead, if your key is * non-unique. * * @param keyFieldIndex The key. Client code must assure that key is unique * in the result set. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(int, Class) */ Map fetchMap(int keyFieldIndex, RecordMapper mapper) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped by the given mapper. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(String, Class)} instead, if your key * is non-unique. * * @param keyFieldName The key. Client code must assure that key is unique * in the result set. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(String, Class) */ Map fetchMap(String keyFieldName, RecordMapper mapper) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given key and mapped by the given mapper. *

* An exception is thrown, if the key turn out to be non-unique in the * result set. Use {@link #fetchGroups(Name, Class)} instead, if your key * is non-unique. * * @param keyFieldName The key. Client code must assure that key is unique * in the result set. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @throws InvalidResultException if the key is non-unique in the result * set. * @see Result#intoMap(Name, Class) */ Map fetchMap(Name keyFieldName, RecordMapper mapper) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and a list of corresponding records as value. *

* Unlike {@link #fetchMap(Field)}, this method allows for non-unique keys * in the result set. *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param The key's generic field type * @param key The key field. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(Field) */ Map> fetchGroups(Field key) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and a list of corresponding records as value. *

* Unlike {@link #fetchMap(int)}, this method allows for non-unique keys in * the result set. *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param keyFieldIndex The key field index. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(int) */ Map> fetchGroups(int keyFieldIndex) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and a list of corresponding records as value. *

* Unlike {@link #fetchMap(String)}, this method allows for non-unique keys * in the result set. *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param keyFieldName The key field name. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(String) */ Map> fetchGroups(String keyFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and a list of corresponding records as value. *

* Unlike {@link #fetchMap(Name)}, this method allows for non-unique keys * in the result set. *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param keyFieldName The key field name. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(Name) */ Map> fetchGroups(Name keyFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* Unlike {@link #fetchMap(Field, Field)}, this method allows for non-unique * keys in the result set. * * @param The key's generic field type * @param The value's generic field type * @param key The key field. * @param value The value field * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(Field, Field) */ Map> fetchGroups(Field key, Field value) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* Unlike {@link #fetchMap(int, int)}, this method allows for non-unique * keys in the result set. * * @param keyFieldIndex The key field index. * @param valueFieldIndex The value field index. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(int, int) */ Map> fetchGroups(int keyFieldIndex, int valueFieldIndex) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* Unlike {@link #fetchMap(String, String)}, this method allows for * non-unique keys in the result set. * * @param keyFieldName The key field name. * @param valueFieldName The value field name. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(String, String) */ Map> fetchGroups(String keyFieldName, String valueFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with one of the result's * columns as key and another one of the result's columns as value *

* Unlike {@link #fetchMap(Name, Name)}, this method allows for * non-unique keys in the result set. * * @param keyFieldName The key field name. * @param valueFieldName The value field name. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(Name, Name) */ Map> fetchGroups(Name keyFieldName, Name valueFieldName) throws DataAccessException; /** * Execute the query and return a {@link Map} with the result grouped by the * given keys. *

* Unlike {@link #fetchMap(Field[])}, this method allows for non-unique keys * in the result set. * * @param keys The keys used for result grouping. If this is * null or an empty array, the resulting map will * contain at most one entry. * @return A Map containing grouped results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(Field[]) */ Map> fetchGroups(Field[] keys) throws DataAccessException; /** * Execute the query and return a {@link Map} with the result grouped by the * given keys. *

* Unlike {@link #fetchMap(int[])}, this method allows for non-unique keys * in the result set. * * @param keyFieldIndexes The keys used for result grouping. If this is * null or an empty array, the resulting map will * contain at most one entry. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(int[]) */ Map> fetchGroups(int[] keyFieldIndexes) throws DataAccessException; /** * Execute the query and return a {@link Map} with the result grouped by the * given keys. *

* Unlike {@link #fetchMap(String[])}, this method allows for non-unique * keys in the result set. * * @param keyFieldNames The keys used for result grouping. If this is * null or an empty array, the resulting map will * contain at most one entry. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(String[]) */ Map> fetchGroups(String[] keyFieldNames) throws DataAccessException; /** * Execute the query and return a {@link Map} with the result grouped by the * given keys. *

* Unlike {@link #fetchMap(Name[])}, this method allows for non-unique * keys in the result set. * * @param keyFieldNames The keys used for result grouping. If this is * null or an empty array, the resulting map will * contain at most one entry. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(Name[]) */ Map> fetchGroups(Name[] keyFieldNames) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* Unlike {@link #fetchMap(Field[], Class)}, this method allows for * non-unique keys in the result set. * * @param keys The keys. If this is null or an empty array, the * resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing grouped results. This will never be * null. * @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 * @see Result#intoGroups(Field[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(Field[] keys, Class type) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* Unlike {@link #fetchMap(int[], Class)}, this method allows for * non-unique keys in the result set. * * @param keyFieldIndexes The keys. If this is null or an empty * array, the resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(int[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(int[] keyFieldIndexes, Class type) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* Unlike {@link #fetchMap(String[], Class)}, this method allows for * non-unique keys in the result set. * * @param keyFieldNames The keys. If this is null or an empty * array, the resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(String[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(String[] keyFieldNames, Class type) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped into the given entity type. *

* Unlike {@link #fetchMap(Name[], Class)}, this method allows for * non-unique keys in the result set. * * @param keyFieldNames The keys. If this is null or an empty * array, the resulting map will contain at most one entry. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Name[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(Name[] keyFieldNames, Class type) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* Unlike {@link #fetchMap(Field[], RecordMapper)}, this method allows for * non-unique keys in the result set. * * @param keys The keys. If this is null or an empty array, the * resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing grouped results. This will never be * null. * @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 * @see Result#intoGroups(Field[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(Field[] keys, RecordMapper mapper) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* Unlike {@link #fetchMap(int[], RecordMapper)}, this method allows for * non-unique keys in the result set. * * @param keyFieldIndexes The keys. If this is null or an empty * array, the resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(int[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(int[] keyFieldIndexes, RecordMapper mapper) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* Unlike {@link #fetchMap(String[], RecordMapper)}, this method allows for * non-unique keys in the result set. * * @param keyFieldNames The keys. If this is null or an empty * array, the resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(String[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(String[] keyFieldNames, RecordMapper mapper) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given keys and mapped by the given mapper. *

* Unlike {@link #fetchMap(Name[], RecordMapper)}, this method allows for * non-unique keys in the result set. * * @param keyFieldNames The keys. If this is null or an empty * array, the resulting map will contain at most one entry. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Name[], Class) * @see DefaultRecordMapper */ Map> fetchGroups(Name[] keyFieldNames, RecordMapper mapper) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* Unlike {@link #fetchMap(Class)}, this method allows for non-unique keys * in the result set. * * @param keyType The key type. If this is null, the resulting * map will contain at most one entry. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see DefaultRecordMapper */ Map> fetchGroups(Class keyType) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* Unlike {@link #fetchMap(Class, Class)}, this method allows for non-unique * keys in the result set. * * @param keyType The key type. If this is null, the resulting * map will contain at most one entry. * @param valueType The value type. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see DefaultRecordMapper */ Map> fetchGroups(Class keyType, Class valueType) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* Unlike {@link #fetchMap(Class, RecordMapper)}, this method allows for * non-unique keys in the result set. * * @param keyType The key type. If this is null, the resulting * map will contain at most one entry. * @param valueMapper The value mapper. * @return A Map containing grouped results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see DefaultRecordMapper */ Map> fetchGroups(Class keyType, RecordMapper valueMapper) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* Unlike {@link #fetchMap(RecordMapper, RecordMapper)}, this method allows * for non-unique keys in the result set. * * @param keyMapper The key mapper. * @return A Map containing the results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see DefaultRecordMapper */ Map> fetchGroups(RecordMapper keyMapper) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* Unlike {@link #fetchMap(RecordMapper, Class)}, this method allows for * non-unique keys in the result set. * * @param keyMapper The key mapper. * @param valueType The value type. * @return A Map containing the results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see DefaultRecordMapper */ Map> fetchGroups(RecordMapper keyMapper, Class valueType) throws MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given key entity and mapped into the given entity type. *

* The grouping semantics is governed by the key type's * {@link Object#equals(Object)} and {@link Object#hashCode()} * implementation, not necessarily the values as fetched from the database. *

* Unlike {@link #fetchMap(RecordMapper, RecordMapper)}, this method allows * for non-unique keys in the result set. * * @param keyMapper The key mapper. * @param valueMapper The value mapper. * @return A Map containing the results. This will never be * null. * @throws MappingException wrapping any reflection or data type conversion * exception that might have occurred while mapping records * @see DefaultRecordMapper */ Map> fetchGroups(RecordMapper keyMapper, RecordMapper valueMapper) throws MappingException; /** * Execute the query and return a {@link Map} with the result grouped by the * given table. *

* Unlike {@link #fetchMap(Table)}, this method allows for non-unique keys * in the result set. * * @param table The key table. May not be null. * @return A Map containing the results. This will never be * null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoGroups(Field[]) */ Map> fetchGroups(Table table) throws DataAccessException; /** * Execute the query and return a {@link Map} with results grouped by the * given table and mapped into the given entity type. *

* Unlike {@link #fetchMap(Table, Class)}, this method allows for non-unique * keys in the result set. * * @param table The key table. May not be null. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Table, Class) * @see DefaultRecordMapper */ Map> fetchGroups(Table table, Class type) throws DataAccessException, MappingException; /** * Execute the query and return a {@link Map} with results grouped by the * given table and mapped by the given mapper. *

* Unlike {@link #fetchMap(Table, RecordMapper)}, this method allows for * non-unique keys in the result set. * * @param table The key table. May not be null. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Table, Class) * @see DefaultRecordMapper */ Map> fetchGroups(Table table, RecordMapper mapper) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped * into the given entity type. * * @param The key's generic field type * @param The generic entity type. * @param key The key field. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Field, Class) * @see DefaultRecordMapper */ Map> fetchGroups(Field key, Class type) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped * into the given entity type. * * @param keyFieldIndex The key field index. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(int, Class) * @see DefaultRecordMapper */ Map> fetchGroups(int keyFieldIndex, Class type) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped * into the given entity type. * * @param keyFieldName The key field name. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(String, Class) * @see DefaultRecordMapper */ Map> fetchGroups(String keyFieldName, Class type) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped * into the given entity type. * * @param keyFieldName The key field name. * @param type The entity type. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Name, Class) * @see DefaultRecordMapper */ Map> fetchGroups(Name keyFieldName, Class type) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped by * the given mapper. * * @param The key's generic field type * @param The generic entity type. * @param key The key field. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Field, Class) * @see DefaultRecordMapper */ Map> fetchGroups(Field key, RecordMapper mapper) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped by * the given mapper. * * @param keyFieldIndex The key field index. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(int, Class) * @see DefaultRecordMapper */ Map> fetchGroups(int keyFieldIndex, RecordMapper mapper) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped by * the given mapper. * * @param keyFieldName The key field name. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(String, Class) * @see DefaultRecordMapper */ Map> fetchGroups(String keyFieldName, RecordMapper mapper) throws DataAccessException, MappingException; /** * Return a {@link Map} with results grouped by the given key and mapped by * the given mapper. * * @param keyFieldName The key field name. * @param mapper The mapper callback. * @return A Map containing the results. This will never be * null. * @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 * @see Result#intoGroups(Name, Class) * @see DefaultRecordMapper */ Map> fetchGroups(Name keyFieldName, RecordMapper mapper) throws DataAccessException, MappingException; /** * Execute the query and return the generated result as an Object matrix. *

* You can access data like this *

query.fetchArray()[recordIndex][fieldIndex]
* * @return The result. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArrays() */ Object[][] fetchArrays() throws DataAccessException; /** * Execute the query and return the generated result as an array of records. *

* * @return The result. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#toArray(Object[]) */ R[] fetchArray() throws DataAccessException; /** * Execute the query and return all values for a field index from the * generated result. *

* You can access data like this *

query.fetchArray(fieldIndex)[recordIndex]
* * @return The resulting values. This may be an array type more concrete * than Object[], depending on whether jOOQ has any * knowledge about fieldIndex's actual type. This will * never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(int) */ Object[] fetchArray(int fieldIndex) throws DataAccessException; /** * Execute the query and return all values for a field index from the * generated result. *

* You can access data like this *

query.fetchArray(fieldIndex)[recordIndex]
* * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(int, Class) */ T[] fetchArray(int fieldIndex, Class type) throws DataAccessException; /** * Execute the query and return all values for a field index from the * generated result. *

* You can access data like this *

query.fetchArray(fieldIndex)[recordIndex]
* * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(int, Converter) */ U[] fetchArray(int fieldIndex, Converter converter) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. *

* You can access data like this *

query.fetchArray(fieldName)[recordIndex]
* * @return The resulting values. This may be an array type more concrete * than Object[], depending on whether jOOQ has any * knowledge about fieldName's actual type. This will * never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(String) */ Object[] fetchArray(String fieldName) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. *

* You can access data like this *

query.fetchArray(fieldName)[recordIndex]
* * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(String, Converter) */ T[] fetchArray(String fieldName, Class type) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. *

* You can access data like this *

query.fetchArray(fieldName)[recordIndex]
* * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(String, Class) */ U[] fetchArray(String fieldName, Converter converter) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. *

* You can access data like this *

query.fetchArray(fieldName)[recordIndex]
* * @return The resulting values. This may be an array type more concrete * than Object[], depending on whether jOOQ has any * knowledge about fieldName's actual type. This will * never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Name) */ Object[] fetchArray(Name fieldName) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. *

* You can access data like this *

query.fetchArray(fieldName)[recordIndex]
* * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Name, Converter) */ T[] fetchArray(Name fieldName, Class type) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. *

* You can access data like this *

query.fetchArray(fieldName)[recordIndex]
* * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Name, Class) */ U[] fetchArray(Name fieldName, Converter converter) throws DataAccessException; /** * Execute the query and return all values for a field from the generated * result. *

* You can access data like this *

query.fetchArray(field)[recordIndex]
* * @return The result. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Field) */ T[] fetchArray(Field field) throws DataAccessException; /** * Execute the query and return all values for a field from the generated * result. *

* You can access data like this *

query.fetchArray(field)[recordIndex]
* * @return The result. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Field, Class) */ T[] fetchArray(Field field, Class type) throws DataAccessException; /** * Execute the query and return all values for a field from the generated * result. *

* You can access data like this *

query.fetchArray(field)[recordIndex]
* * @return The result. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Field, Converter) */ U[] fetchArray(Field field, Converter converter) throws DataAccessException; /** * Execute the query and return all values for a field index from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(int) */ Set fetchSet(int fieldIndex) throws DataAccessException; /** * Execute the query and return all values for a field index from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(int, Class) */ Set fetchSet(int fieldIndex, Class type) throws DataAccessException; /** * Execute the query and return all values for a field index from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(int, Converter) */ Set fetchSet(int fieldIndex, Converter converter) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(String) */ Set fetchSet(String fieldName) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(String, Converter) */ Set fetchSet(String fieldName, Class type) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(String, Class) */ Set fetchSet(String fieldName, Converter converter) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Name) */ Set fetchSet(Name fieldName) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Name, Converter) */ Set fetchSet(Name fieldName, Class type) throws DataAccessException; /** * Execute the query and return all values for a field name from the * generated result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Name, Class) */ Set fetchSet(Name fieldName, Converter converter) throws DataAccessException; /** * Execute the query and return all values for a field from the generated * result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Field) */ Set fetchSet(Field field) throws DataAccessException; /** * Execute the query and return all values for a field from the generated * result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Field, Class) */ Set fetchSet(Field field, Class type) throws DataAccessException; /** * Execute the query and return all values for a field from the generated * result. * * @return The resulting values. This will never be null. * @throws DataAccessException if something went wrong executing the query * @see Result#intoArray(Field, Converter) */ Set fetchSet(Field field, Converter converter) throws DataAccessException; /** * Map resulting records onto a custom type. *

* This is the same as calling fetch().into(type). See * {@link Record#into(Class)} for more details * * @param The generic entity type. * @param type The entity type. * @see Record#into(Class) * @see Result#into(Class) * @return The results. This will never be null. * @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 * @see DefaultRecordMapper */ List fetchInto(Class type) throws DataAccessException, MappingException; /** * Map resulting records onto a custom record. *

* This is the same as calling fetch().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. * * @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 */ Result fetchInto(Table table) throws DataAccessException; /** * Fetch results into a custom handler callback. *

* The resulting records are attached to the original {@link Configuration} * by default. Use {@link Settings#isAttachRecords()} to override this * behaviour. * * @param handler The handler callback * @return Convenience result, returning the parameter handler itself * @throws DataAccessException if something went wrong executing the query */ > H fetchInto(H handler) throws DataAccessException; /** * Fetch results into a custom mapper callback. * * @param mapper The mapper callback * @return The result. This will never be null. * @throws DataAccessException if something went wrong executing the query */ List fetch(RecordMapper mapper) throws DataAccessException; /** * Fetch results in a new {@link CompletionStage}. *

* The result is asynchronously completed by a task running in an * {@link Executor} provided by the underlying * {@link Configuration#executorProvider()}. * * @return The completion stage. The completed result will never be * null. */ CompletionStage> fetchAsync(); /** * Fetch results in a new {@link CompletionStage} that is asynchronously * completed by a task running in the given executor. * * @return The completion stage. The completed result will never be * null. */ CompletionStage> fetchAsync(Executor executor); /** * Fetch results asynchronously. *

* This method wraps fetching of records in a * {@link java.util.concurrent.Future}, such that you can access the actual * records at a future instant. This is especially useful when *

    *
  • You want to load heavy data in the background, for instance when the * user logs in and accesses a pre-calculated dashboard screen, before they * access the heavy data.
  • *
  • You want to parallelise several independent OLAP queries before * merging all data into a single report
  • *
  • ...
  • *
*

* This will internally create a "single thread executor", that is shut down * at the end of the {@link FutureResult}'s lifecycle. Use * {@link #fetchLater(ExecutorService)} instead, if you want control over * your executing threads. *

* The result and its contained records are attached to the original * {@link Configuration} by default. Use {@link Settings#isAttachRecords()} * to override this behaviour. * * @return A future result * @throws DataAccessException if something went wrong executing the query * @deprecated - 3.2.0 - [#2581] - This method will be removed in jOOQ 4.0 */ @Deprecated FutureResult fetchLater() throws DataAccessException; /** * Fetch results asynchronously. *

* This method wraps fetching of records in a * {@link java.util.concurrent.Future}, such that you can access the actual * records at a future instant. This is especially useful when *

    *
  • You want to load heavy data in the background, for instance when the * user logs in and accesses a pre-calculated dashboard screen, before they * access the heavy data.
  • *
  • You want to parallelise several independent OLAP queries before * merging all data into a single report
  • *
  • ...
  • *
*

* Use this method rather than {@link #fetchLater()}, in order to keep * control over thread lifecycles, if you manage threads in a J2EE container * or with Spring, for instance. *

* The result and its contained records are attached to the original * {@link Configuration} by default. Use {@link Settings#isAttachRecords()} * to override this behaviour. * * @param executor A custom executor * @return A future result * @throws DataAccessException if something went wrong executing the query * @deprecated - 3.2.0 - [#2581] - This method will be removed in jOOQ 4.0 */ @Deprecated FutureResult fetchLater(ExecutorService executor) throws DataAccessException; /** * The record type produced by this query. */ Class getRecordType(); /** * {@inheritDoc} */ @Override ResultQuery bind(String param, Object value) throws IllegalArgumentException, DataTypeException; /** * {@inheritDoc} */ @Override ResultQuery bind(int index, Object value) throws IllegalArgumentException, DataTypeException; // ------------------------------------------------------------------------ // JDBC methods // ------------------------------------------------------------------------ /** * {@inheritDoc} */ @Override ResultQuery queryTimeout(int timeout); /** * {@inheritDoc} */ @Override ResultQuery keepStatement(boolean keepStatement); /** * Specify the maximum number of rows returned by the underlying * {@link Statement}. *

* This is not the same as setting a LIMIT .. OFFSET clause * onto the statement, where the result set is restricted within the * database. * * @see Statement#setMaxRows(int) */ ResultQuery maxRows(int rows); /** * Specify the fetch size of the underlying {@link Statement}. *

* Regardless of this setting, {@link #fetchLazy()} is the only way in jOOQ * not to fetch all data in memory. However, you may influence how your JDBC * driver interacts with your database through specifying a fetch size. *

* Dialect-specific remarks: *

    *
  • MySQL uses {@link Integer#MIN_VALUE} as an indicator to fetch * resulting rows row-by-row in conjunction with * {@link ResultSet#TYPE_FORWARD_ONLY} (set in {@link #resultSetType(int)}) * and {@link ResultSet#CONCUR_READ_ONLY} (set in * {@link #resultSetConcurrency(int)}). See * this page here for details.
  • *
  • PostgreSQL does not like fetch sizes being combined with * {@link Connection#getAutoCommit()} == true. For more * information, see this page here
  • *
* * @see Statement#setFetchSize(int) */ ResultQuery fetchSize(int rows); /** * Specify the ResultSet concurrency of ResultSet * objects created by jOOQ. *

* This will affect the way you may perceive ResultSet objects * obtained from any of these methods: *

    *
  • {@link ResultQuery#fetchResultSet()}
  • *
  • {@link Cursor#resultSet()}
  • *
  • {@link ExecuteContext#resultSet()}
  • *
* * @see Statement#getResultSetConcurrency() */ ResultQuery resultSetConcurrency(int resultSetConcurrency); /** * Specify the ResultSet type of ResultSet * objects created by jOOQ. *

* This will affect the way you may perceive ResultSet objects * obtained from any of these methods: *

    *
  • {@link ResultQuery#fetchResultSet()}
  • *
  • {@link Cursor#resultSet()}
  • *
  • {@link ExecuteContext#resultSet()}
  • *
* * @see Statement#getResultSetType() */ ResultQuery resultSetType(int resultSetType); /** * Specify the ResultSet holdability of ResultSet * objects created by jOOQ. *

* This will affect the way you may perceive ResultSet objects * obtained from any of these methods: *

    *
  • {@link ResultQuery#fetchResultSet()}
  • *
  • {@link Cursor#resultSet()}
  • *
  • {@link ExecuteContext#resultSet()}
  • *
* * @see Statement#getResultSetHoldability() */ ResultQuery resultSetHoldability(int resultSetHoldability); /** * Specify a set of fields whose values should be interned. *

* Unlike {@link Result}'s intern() methods, this already * interns values right after fetching them from a JDBC result set. See * {@link Result#intern(int...)} for more details. * * @param fields The fields whose values should be interned * @return The same result query * @see Result#intern(Field...) * @see String#intern() */ ResultQuery intern(Field... fields); /** * Specify a set of field indexes whose values should be interned. *

* Unlike {@link Result}'s intern() methods, this already * interns values right after fetching them from a JDBC result set. See * {@link Result#intern(int...)} for more details. * * @param fieldIndexes The field indexes whose values should be interned * @return The same result query * @see Result#intern(int...) * @see String#intern() */ ResultQuery intern(int... fieldIndexes); /** * Specify a set of field names whose values should be interned. *

* Unlike {@link Result}'s intern() methods, this already * interns values right after fetching them from a JDBC result set. See * {@link Result#intern(String...)} for more details. * * @param fieldNames The field names whose values should be interned * @return The same result query * @see Result#intern(String...) * @see String#intern() */ ResultQuery intern(String... fieldNames); /** * Specify a set of field names whose values should be interned. *

* Unlike {@link Result}'s intern() methods, this already * interns values right after fetching them from a JDBC result set. See * {@link Result#intern(Name...)} for more details. * * @param fieldNames The field names whose values should be interned * @return The same result query * @see Result#intern(Name...) * @see String#intern() */ ResultQuery intern(Name... fieldNames); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy