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

org.jooq.SelectQuery Maven / Gradle / Ivy

There is a newer version: 3.19.9
Show newest version
/*
 * 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.FIREBIRD;
import static org.jooq.SQLDialect.FIREBIRD_3_0;
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
import static org.jooq.SQLDialect.MYSQL_8_0;
// ...
import static org.jooq.SQLDialect.POSTGRES;
import static org.jooq.SQLDialect.POSTGRES_9_5;
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
// ...

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Collection;

import org.jooq.exception.DataAccessException;

/**
 * A query for data selection
 *
 * @author Lukas Eder
 */
@SuppressWarnings("deprecation")
public interface SelectQuery extends Select, ConditionProvider {

    /**
     * Add a list of select fields.
     *
     * @param fields
     */
    @Support
    void addSelect(SelectField... fields);

    /**
     * Add a list of select fields.
     *
     * @param fields
     */
    @Support
    void addSelect(Collection> fields);

    /**
     * Add "distinct" keyword to the select clause.
     */
    @Support
    void setDistinct(boolean distinct);

    /**
     * Add a PostgreSQL-specific DISTINCT ON (fields...) clause.
     * 

* This also sets the distinct flag to true */ @Support({ POSTGRES }) void addDistinctOn(SelectField... fields); /** * Add a PostgreSQL-specific DISTINCT ON (fields...) clause. *

* This also sets the distinct flag to true */ @Support({ POSTGRES }) void addDistinctOn(Collection> fields); /** * Add INTO clause to the SELECT statement. */ @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void setInto(Table table); /** * Add tables to the table product. * * @param from The added tables */ @Support void addFrom(TableLike from); /** * Add tables to the table product. * * @param from The added tables */ @Support void addFrom(TableLike... from); /** * Add tables to the table product. * * @param from The added tables */ @Support void addFrom(Collection> from); /** * Joins the existing table product to a new table using a condition, * connecting them with each other with {@link Operator#AND}. * * @param table The joined table * @param conditions The joining conditions */ @Support void addJoin(TableLike table, Condition... conditions); /** * Joins the existing table product to a new table using a condition, * connecting them with each other with {@link Operator#AND}. * * @param table The joined table * @param type The type of join * @param conditions The joining conditions */ @Support void addJoin(TableLike table, JoinType type, Condition... conditions); /** * Joins the existing table product to a new table with a USING * clause. *

* If this is not supported by your RDBMS, then jOOQ will try to emulate * this behaviour using the information provided in this query. * * @param table The joined table * @param fields The fields for the USING clause */ @Support void addJoinUsing(TableLike table, Collection> fields); /** * Joins the existing table product to a new table with a USING * clause. *

* If this is not supported by your RDBMS, then jOOQ will try to emulate * this behaviour using the information provided in this query. * * @param table The joined table * @param type The type of join * @param fields The fields for the USING clause */ @Support void addJoinUsing(TableLike table, JoinType type, Collection> fields); /** * Joins the existing table product to a new table using a foreign key. * * @param table The joined table * @param type The type of join * @see TableOnStep#onKey(ForeignKey) * @throws DataAccessException If there is no non-ambiguous key definition * known to jOOQ */ @Support void addJoinOnKey(TableLike table, JoinType type) throws DataAccessException; /** * Joins the existing table product to a new table using a foreign key. * * @param table The joined table * @param type The type of join * @param keyFields The foreign key fields * @see TableOnStep#onKey(ForeignKey) * @throws DataAccessException If there is no non-ambiguous key definition * known to jOOQ */ @Support void addJoinOnKey(TableLike table, JoinType type, TableField... keyFields) throws DataAccessException; /** * Joins the existing table product to a new table using a foreign key. * * @param table The joined table * @param type The type of join * @param key The foreign key * @see TableOnStep#onKey(ForeignKey) */ @Support void addJoinOnKey(TableLike table, JoinType type, ForeignKey key); /** * Adds grouping fields. *

* Calling this with an empty argument list will result in an empty * GROUP BY () clause being rendered. * * @param fields The grouping fields */ @Support void addGroupBy(GroupField... fields); /** * Adds grouping fields. *

* Calling this with an empty argument list will result in an empty * GROUP BY () clause being rendered. * * @param fields The grouping fields */ @Support void addGroupBy(Collection fields); /** * Adds new conditions to the having clause of the query, connecting them * with each other with {@link Operator#AND}. * * @param conditions The condition */ @Support void addHaving(Condition... conditions); /** * Adds new conditions to the having clause of the query, connecting them * with each other with {@link Operator#AND}. * * @param conditions The condition */ @Support void addHaving(Collection conditions); /** * Adds new conditions to the having clause of query, connecting them with * each other with {@link Operator#AND}. * * @param operator The operator to use to add the conditions to the existing * conditions * @param conditions The condition */ @Support void addHaving(Operator operator, Condition... conditions); /** * Adds new conditions to the having clause of query, connecting them with * each other with {@link Operator#AND}. * * @param operator The operator to use to add the conditions to the existing * conditions * @param conditions The condition */ @Support void addHaving(Operator operator, Collection conditions); /** * Adds new window definitions to the window clause of the query. * * @param definitions The definitions */ @Support({ CUBRID, FIREBIRD_3_0, MYSQL_8_0, POSTGRES }) void addWindow(WindowDefinition... definitions); /** * Adds new window definitions to the window clause of the query. * * @param definitions The definitions */ @Support({ CUBRID, FIREBIRD_3_0, MYSQL_8_0, POSTGRES }) void addWindow(Collection definitions); /** * Add an Oracle-style hint to the select clause. *

* Example:

     * DSLContext create = DSL.using(configuration);
     *
     * create.select(field1, field2)
     *       .hint("/*+ALL_ROWS*/")
     *       .from(table1)
     *       .execute();
     * 
*

* You can also use this clause for any other database, that accepts hints * or options at the same syntactic location, e.g. for MySQL's * SQL_CALC_FOUND_ROWS option:

     * create.select(field1, field2)
     *       .hint("SQL_CALC_FOUND_ROWS")
     *       .from(table1)
     *       .fetch();
     * 
*

* The outcome of such a query is this:

     * SELECT [hint] field1, field2 FROM table1
     * 
*

* For SQL Server style table hints, see {@link Table#with(String)} * * @see Table#with(String) */ @Support void addHint(String hint); /** * Add a SQL Server-style query hint to the select clause. *

* Example:

     * DSLContext create = DSL.using(configuration);
     *
     * create.select(field1, field2)
     *       .from(table1)
     *       .option("OPTION (OPTIMIZE FOR UNKNOWN)")
     *       .execute();
     * 
*

* You can also use this clause for any other database, that accepts hints * or options at the same syntactic location, e.g. for DB2's isolation clause:

     * create.select(field1, field2)
     *       .from(table1)
     *       .option("WITH RR USE AND KEEP EXCLUSIVE LOCKS")
     *       .execute();
     * 
*

* The outcome of such a query is this:

     * SELECT field1, field2 FROM table1 [option]
     * 
*

* For SQL Server style table hints, see {@link Table#with(String)} * * @see Table#with(String) */ @Support void addOption(String option); /** * Add an Oracle-specific CONNECT BY clause to the query. */ @Support({ CUBRID }) void addConnectBy(Condition condition); /** * Add an Oracle-specific CONNECT BY NOCYCLE clause to the * query. */ @Support({ CUBRID }) void addConnectByNoCycle(Condition condition); /** * Add an Oracle-specific START WITH clause to the query's * CONNECT BY clause. */ @Support({ CUBRID }) void setConnectByStartWith(Condition condition); // ------------------------------------------------------------------------ // Methods from ConditionProvider, OrderProvider, LockProvider // ------------------------------------------------------------------------ /** * {@inheritDoc} */ @Override @Support void addConditions(Condition... conditions); /** * {@inheritDoc} */ @Override @Support void addConditions(Collection conditions); /** * {@inheritDoc} */ @Override @Support void addConditions(Operator operator, Condition... conditions); /** * {@inheritDoc} */ @Override @Support void addConditions(Operator operator, Collection conditions); /** * Adds ordering fields. * * @param fields The ordering fields */ @Support void addOrderBy(OrderField... fields); /** * Adds ordering fields. * * @param fields The ordering fields */ @Support void addOrderBy(Collection> fields); /** * Adds ordering fields. *

* Indexes start at 1 in SQL! *

* Note, you can use addOrderBy(DSL.val(1).desc()) or * addOrderBy(DSL.literal(1).desc()) to apply descending * ordering * * @param fieldIndexes The ordering fields */ @Support void addOrderBy(int... fieldIndexes); /** * Indicate whether the SIBLINGS keyword should be used in an * ORDER BY clause to form an ORDER SIBLINGS BY * clause. *

* This clause can be used only along with Oracle's CONNECT BY * clause, to indicate that the hierarchical ordering should be preserved * and elements of each hierarchy should be ordered among themselves. * * @param orderBySiblings */ @Support({ CUBRID }) void setOrderBySiblings(boolean orderBySiblings); /** * Adds seeking fields. * * @param fields The seeking fields */ @Support void addSeekAfter(Field... fields); /** * Adds seeking fields. * * @param fields The seeking fields */ @Support void addSeekAfter(Collection> fields); /** * Adds seeking fields. * * @param fields The seeking fields */ @Support void addSeekBefore(Field... fields); /** * Adds seeking fields. * * @param fields The seeking fields */ @Support void addSeekBefore(Collection> fields); /** * Add an OFFSET clause to the query. *

* If there is no LIMIT .. OFFSET or TOP clause in * your RDBMS, or if your RDBMS does not natively support offsets, this is * emulated with a ROW_NUMBER() window function and nested * SELECT statements. */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void addOffset(int offset); /** * Add an OFFSET clause to the query using a named parameter. *

* If there is no LIMIT .. OFFSET or TOP clause in * your RDBMS, or if your RDBMS does not natively support offsets, this is * emulated with a ROW_NUMBER() window function and nested * SELECT statements. */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void addOffset(Param offset); /** * Limit the results of this select. *

* This is the same as calling {@link #addLimit(int, int)} with offset = 0 * * @param numberOfRows The number of rows to return */ @Support void addLimit(int numberOfRows); /** * Limit the results of this select using named parameters. *

* Note that some dialects do not support bind values at all in * LIMIT or TOP clauses! *

* If there is no LIMIT or TOP clause in your * RDBMS, or the LIMIT or TOP clause does not * support bind values, this may be emulated with a * ROW_NUMBER() window function and nested SELECT * statements. *

* This is the same as calling {@link #addLimit(int, int)} with offset = 0 * * @param numberOfRows The number of rows to return */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void addLimit(Param numberOfRows); /** * Limit the results of this select. *

* Note that some dialects do not support bind values at all in * LIMIT or TOP clauses! *

* If there is no LIMIT or TOP clause in your * RDBMS, or if your RDBMS does not natively support offsets, this is * emulated with a ROW_NUMBER() window function and nested * SELECT statements. * * @param offset The lowest offset starting at 0 * @param numberOfRows The number of rows to return */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void addLimit(int offset, int numberOfRows); /** * Limit the results of this select. *

* Note that some dialects do not support bind values at all in * LIMIT or TOP clauses! *

* If there is no LIMIT or TOP clause in your * RDBMS, or the LIMIT or TOP clause does not * support bind values, or if your RDBMS does not natively support offsets, * this may be emulated with a ROW_NUMBER() window function * and nested SELECT statements. * * @param offset The lowest offset starting at 0 * @param numberOfRows The number of rows to return */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void addLimit(Param offset, int numberOfRows); /** * Limit the results of this select using named parameters. *

* Note that some dialects do not support bind values at all in * LIMIT or TOP clauses! *

* If there is no LIMIT or TOP clause in your * RDBMS, or the LIMIT or TOP clause does not * support bind values, or if your RDBMS does not natively support offsets, * this may be emulated with a ROW_NUMBER() window function * and nested SELECT statements. * * @param offset The lowest offset starting at 0 * @param numberOfRows The number of rows to return */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void addLimit(int offset, Param numberOfRows); /** * Limit the results of this select using named parameters. *

* Note that some dialects do not support bind values at all in * LIMIT or TOP clauses! *

* If there is no LIMIT or TOP clause in your * RDBMS, or the LIMIT or TOP clause does not * support bind values, or if your RDBMS does not natively support offsets, * this may be emulated with a ROW_NUMBER() window function * and nested SELECT statements. * * @param offset The lowest offset starting at 0 * @param numberOfRows The number of rows to return */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) void addLimit(Param offset, Param numberOfRows); /** * Add the WITH TIES clause to a LIMIT clause. */ @Support({ CUBRID, FIREBIRD_3_0, MYSQL_8_0, POSTGRES }) void setWithTies(boolean withTies); /** * Sets the "FOR UPDATE" flag onto the query. *

*

Native implementation
*

* This has been observed to be supported by any of these dialects: *

*

*

emulation
*

* These dialects can emulate the FOR UPDATE clause using a * cursor. The cursor is handled by the JDBC driver, at * {@link PreparedStatement} construction time, when calling * {@link Connection#prepareStatement(String, int, int)} with * {@link ResultSet#CONCUR_UPDATABLE}. jOOQ handles emulation of a * FOR UPDATE clause using CONCUR_UPDATABLE for * these dialects: *

    *
  • {@link SQLDialect#CUBRID}
  • *
  • {@link SQLDialect#SQLSERVER}
  • *
*

* Note: This emulation may not be efficient for large result sets! *

*

Not supported
*

* These dialects are known not to support the FOR UPDATE * clause in regular SQL: *

    *
  • {@link SQLDialect#SQLITE}
  • *
*

* If your dialect does not support this clause, jOOQ will still render it, * if you apply it to your query. This might then cause syntax errors * reported either by your database or your JDBC driver. *

* You shouldn't combine this with {@link #setForShare(boolean)} * * @param forUpdate The flag's value */ @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) void setForUpdate(boolean forUpdate); /** * Some RDBMS allow for specifying the fields that should be locked by the * FOR UPDATE clause, instead of the full row. *

* This automatically sets the {@link #setForUpdate(boolean)} flag, and * unsets the {@link #setForShare(boolean)} flag, if it was previously set. *

* This has been observed to be natively supported by any of these dialects: *

    *
  • DB2
  • *
  • Derby
  • *
  • H2
  • *
  • HSQLDB
  • *
  • Ingres
  • *
  • Oracle
  • *
  • Sybase
  • *
*

* Note, that {@link SQLDialect#DB2} has some stricter requirements * regarding the updatability of fields. Refer to the DB2 documentation for * further details * * @param fields The fields that should be locked */ @Support({ DERBY, FIREBIRD, H2, HSQLDB }) void setForUpdateOf(Field... fields); /** * Some RDBMS allow for specifying the fields that should be locked by the * FOR UPDATE clause, instead of the full row. *

* * @see #setForUpdateOf(Field...) */ @Support({ DERBY, FIREBIRD, H2, HSQLDB }) void setForUpdateOf(Collection> fields); /** * Some RDBMS allow for specifying the tables that should be locked by the * FOR UPDATE clause, instead of the full row. *

* This automatically sets the {@link #setForUpdate(boolean)} flag, and * unsets the {@link #setForShare(boolean)} flag, if it was previously set. *

* This has been observed to be natively supported by any of these dialects: *

    *
  • Postgres
  • *
  • H2
  • *
  • HSQLDB
  • *
  • Sybase
  • *
*

* jOOQ emulates this by locking all known fields of [tables] * for any of these dialects: *

    *
  • DB2
  • *
  • Derby
  • *
  • Ingres
  • *
  • Oracle
  • *
* * @param tables The tables that should be locked */ @Support({ DERBY, FIREBIRD, H2, HSQLDB, MYSQL_8_0, POSTGRES }) void setForUpdateOf(Table... tables); /** * Some RDBMS allow for specifying the locking mode for the applied * FOR UPDATE clause. In this case, the session will not wait * before aborting the lock acquirement if the lock is not available. *

* This automatically sets the {@link #setForUpdate(boolean)} flag, and * unsets the {@link #setForShare(boolean)} flag, if it was previously set. *

* This has been observed to be supported by any of these dialects: *

    *
  • Oracle
  • *
*/ @Support({ MYSQL_8_0, POSTGRES }) void setForUpdateNoWait(); /** * Some RDBMS allow for specifying the locking mode for the applied * FOR UPDATE clause. In this case, the session will skip all * locked rows from the select statement, whose lock is not available. *

* This automatically sets the {@link #setForUpdate(boolean)} flag, and * unsets the {@link #setForShare(boolean)} flag, if it was previously set. *

* This has been observed to be supported by any of these dialects: *

    *
  • Oracle
  • *
*/ @Support({ MYSQL_8_0, POSTGRES_9_5 }) void setForUpdateSkipLocked(); /** * Sets the "FOR SHARE" flag onto the query. *

* This has been observed to be supported by any of these dialects: *

*

* If your dialect does not support this clause, jOOQ will still render it, * if you apply it to your query. This might then cause syntax errors * reported either by your database or your JDBC driver. *

* You shouldn't combine this with {@link #setForUpdate(boolean)} * * @param forShare The flag's value */ @Support({ MARIADB, MYSQL, POSTGRES }) void setForShare(boolean forShare); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy