/*
 * 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 static org.jooq.SQLDialect.CUBRID;
// ...
import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
// ...
// ...
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
// ...
// ...

import java.util.List;

import org.jooq.exception.DataAccessException;
import org.jooq.impl.DSL;

import org.jetbrains.annotations.NotNull;

A SELECT statement.

Example:

// Assuming import static org.jooq.impl.DSL.*;
using(configuration)
   .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
   .from(ACTOR)
   .fetch();

Instances can be created using DSL.select(SelectFieldOrAsterisk...), or DSLContext.selectQuery() and overloads.

Author:Lukas Eder
Type parameters:
  • <R> – The record type being returned by this query
/** * A <code>SELECT</code> statement. * <p> * <strong>Example:</strong> * <p> * <code><pre> * // Assuming import static org.jooq.impl.DSL.*; * * using(configuration) * .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME) * .from(ACTOR) * .fetch(); * </pre></code> * <p> * Instances can be created using {@link DSL#select(SelectFieldOrAsterisk...)}, * or {@link DSLContext#selectQuery()} and overloads. * * @param <R> The record type being returned by this query * @author Lukas Eder */
public interface Select<R extends Record> extends ResultQuery<R>, TableLike<R>, FieldLike {
Apply the UNION set operation.
Throws:
  • IllegalArgumentException – If the argument select has the same identity as this select. The jOOQ 3.x API is mutable, which means that calls to the DSL API mutate this instance. Adding this instance as an set operation argument would lead to a StackOverflowError when generating the SQL.
/** * Apply the <code>UNION</code> set operation. * * @throws IllegalArgumentException If the argument select has the same * identity as this select. The jOOQ 3.x API is mutable, which * means that calls to the DSL API mutate this instance. Adding * this instance as an set operation argument would lead to a * {@link StackOverflowError} when generating the SQL. */
@NotNull @Support Select<R> union(Select<? extends R> select);
Apply the UNION ALL set operation.
Throws:
  • IllegalArgumentException – If the argument select has the same identity as this select. The jOOQ 3.x API is mutable, which means that calls to the DSL API mutate this instance. Adding this instance as an set operation argument would lead to a StackOverflowError when generating the SQL.
/** * Apply the <code>UNION ALL</code> set operation. * * @throws IllegalArgumentException If the argument select has the same * identity as this select. The jOOQ 3.x API is mutable, which * means that calls to the DSL API mutate this instance. Adding * this instance as an set operation argument would lead to a * {@link StackOverflowError} when generating the SQL. */
@NotNull @Support Select<R> unionAll(Select<? extends R> select);
Apply the EXCEPT (or MINUS) set operation.
Throws:
  • IllegalArgumentException – If the argument select has the same identity as this select. The jOOQ 3.x API is mutable, which means that calls to the DSL API mutate this instance. Adding this instance as an set operation argument would lead to a StackOverflowError when generating the SQL.
/** * Apply the <code>EXCEPT</code> (or <code>MINUS</code>) set operation. * * @throws IllegalArgumentException If the argument select has the same * identity as this select. The jOOQ 3.x API is mutable, which * means that calls to the DSL API mutate this instance. Adding * this instance as an set operation argument would lead to a * {@link StackOverflowError} when generating the SQL. */
@NotNull @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, POSTGRES, SQLITE }) Select<R> except(Select<? extends R> select);
Apply the EXCEPT ALL set operation.
Throws:
  • IllegalArgumentException – If the argument select has the same identity as this select. The jOOQ 3.x API is mutable, which means that calls to the DSL API mutate this instance. Adding this instance as an set operation argument would lead to a StackOverflowError when generating the SQL.
/** * Apply the <code>EXCEPT ALL</code> set operation. * * @throws IllegalArgumentException If the argument select has the same * identity as this select. The jOOQ 3.x API is mutable, which * means that calls to the DSL API mutate this instance. Adding * this instance as an set operation argument would lead to a * {@link StackOverflowError} when generating the SQL. */
@NotNull @Support({ CUBRID, DERBY, HSQLDB, POSTGRES }) Select<R> exceptAll(Select<? extends R> select);
Apply the INTERSECT set operation.
Throws:
  • IllegalArgumentException – If the argument select has the same identity as this select. The jOOQ 3.x API is mutable, which means that calls to the DSL API mutate this instance. Adding this instance as an set operation argument would lead to a StackOverflowError when generating the SQL.
/** * Apply the <code>INTERSECT</code> set operation. * * @throws IllegalArgumentException If the argument select has the same * identity as this select. The jOOQ 3.x API is mutable, which * means that calls to the DSL API mutate this instance. Adding * this instance as an set operation argument would lead to a * {@link StackOverflowError} when generating the SQL. */
@NotNull @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, POSTGRES, SQLITE }) Select<R> intersect(Select<? extends R> select);
Apply the INTERSECT ALL set operation.
Throws:
  • IllegalArgumentException – If the argument select has the same identity as this select. The jOOQ 3.x API is mutable, which means that calls to the DSL API mutate this instance. Adding this instance as an set operation argument would lead to a StackOverflowError when generating the SQL.
/** * Apply the <code>INTERSECT ALL</code> set operation. * * @throws IllegalArgumentException If the argument select has the same * identity as this select. The jOOQ 3.x API is mutable, which * means that calls to the DSL API mutate this instance. Adding * this instance as an set operation argument would lead to a * {@link StackOverflowError} when generating the SQL. */
@NotNull @Support({ CUBRID, DERBY, HSQLDB, POSTGRES }) Select<R> intersectAll(Select<? extends R> select);
All fields selected in this query
/** * All fields selected in this query */
@NotNull List<Field<?>> getSelect();
Execute this query in the context of its attached executor and return a COUNT(*) value.

This wraps a pre-existing SELECT query in another one to calculate the COUNT(*) value, without modifying the original SELECT. An example:

-- Original query:
SELECT id, title FROM book WHERE title LIKE '%a%'
-- Wrapped query:
SELECT count(*) FROM (
  SELECT id, title FROM book WHERE title LIKE '%a%'
)
This is particularly useful for those databases that do not support the COUNT(*) OVER() window function to calculate total results in paged queries.
Throws:
Returns:The COUNT(*) result
Deprecated:- 3.5.0 - [#3356] - This method is being removed as it is confusingly different from all the other types of ResultQuery.fetch() methods, in that it modifies the original Select statement by wrapping it. In particular, this method can be easily confused with ResultQuery.fetch(Field), or more concretely fetch(count()), which has an entirely different semantics. Use DSLContext.fetchCount(Select<?>) instead.
/** * Execute this query in the context of its attached executor and return a * <code>COUNT(*)</code> value. * <p> * This wraps a pre-existing <code>SELECT</code> query in another one to * calculate the <code>COUNT(*)</code> value, without modifying the original * <code>SELECT</code>. An example: <code><pre> * -- Original query: * SELECT id, title FROM book WHERE title LIKE '%a%' * * -- Wrapped query: * SELECT count(*) FROM ( * SELECT id, title FROM book WHERE title LIKE '%a%' * ) * </pre></code> This is particularly useful for those databases that do not * support the <code>COUNT(*) OVER()</code> window function to calculate * total results in paged queries. * * @return The <code>COUNT(*)</code> result * @throws DataAccessException if something went wrong executing the query * @deprecated - 3.5.0 - [#3356] - This method is being removed as it is * confusingly different from all the other types of * {@link #fetch()} methods, in that it modifies the original * {@link Select} statement by wrapping it. In particular, this * method can be easily confused with {@link #fetch(Field)}, or * more concretely <code>fetch(count())</code>, which has an * entirely different semantics. Use * {@link DSLContext#fetchCount(Select)} instead. */
@Deprecated int fetchCount() throws DataAccessException; }