SelectQuery

class SelectQuery @PublishedApi constructor(provider: SessionProvider, selectClause: String) : RunnableQuery<SelectQuery>

A SELECT under construction.

Every clause takes SQL and passes it through: from("legions l JOIN provinces p ON l.province_id = p.id") is written out because that is the join, not because the builder has a way to describe joins. What the builder does is the mechanical part - the keywords, the order they go in, and above all the clauses that disappear when they have nothing to say, which is what makes a filter assembled at runtime bearable.

val senators = db.select("id", "cognomen", "province_id")
.from("senate")
.where(filter.sql) // null or empty leaves out the WHERE entirely
.orderBy("cognomen")
.page(page = 0, size = 20)
.fetchObjects<Senator>(filter.params)

The terminal methods come from RunnableQuery, so parameters are supplied there and never carried here.

Constructors

Link copied to clipboard
internal constructor(provider: SessionProvider, selectClause: String)

Properties

Link copied to clipboard

Decides which session the terminals run on.

Functions

Link copied to clipboard

Switches this query to the result style: every terminal on the returned object hands back a DataResult instead of throwing.

Link copied to clipboard

Turns this query into a step of a TransactionPlan instead of something to run now.

Link copied to clipboard

Returns an independent copy, so that variants can be built from a shared base.

Link copied to clipboard
internal fun copyConvertersFrom(other: RunnableQuery<*>)

Carries registered converters into a builder's copy(), alongside whatever clauses it copies.

Link copied to clipboard
inline fun <T> fetchField(params: Map<String, Any?> = emptyMap()): T
inline fun <T> fetchField(vararg params: Pair<String, Any?>): T

Runs the query and returns the first column of its single row as T.

Link copied to clipboard
inline fun <T> fetchFields(params: Map<String, Any?> = emptyMap()): List<T>
inline fun <T> fetchFields(vararg params: Pair<String, Any?>): List<T>

Runs the query and returns the first column of every row as T.

Link copied to clipboard
inline fun <T> fetchFieldStrict(params: Map<String, Any?> = emptyMap()): T
inline fun <T> fetchFieldStrict(vararg params: Pair<String, Any?>): T

As fetchField, but the query must return exactly one row rather than at most one.

Link copied to clipboard
inline fun <T : Any> fetchObject(params: Map<String, Any?> = emptyMap()): T?
inline fun <T : Any> fetchObject(vararg params: Pair<String, Any?>): T?

Runs the query and maps its single row onto T, or null where none matched.

Link copied to clipboard
inline fun <T : Any> fetchObjects(params: Map<String, Any?> = emptyMap()): List<T>
inline fun <T : Any> fetchObjects(vararg params: Pair<String, Any?>): List<T>

Runs the query and maps every row onto T.

Link copied to clipboard
inline fun <T : Any> fetchObjectStrict(params: Map<String, Any?> = emptyMap()): T
inline fun <T : Any> fetchObjectStrict(vararg params: Pair<String, Any?>): T

Runs the query and maps its single row onto T, throwing where the count was anything but one.

Link copied to clipboard
fun fetchRow(params: Map<String, Any?> = emptyMap()): Row?
fun fetchRow(vararg params: Pair<String, Any?>): Row?

Runs the query and returns its single row, or null where none matched.

Link copied to clipboard
fun fetchRows(params: Map<String, Any?> = emptyMap()): List<Row>
fun fetchRows(vararg params: Pair<String, Any?>): List<Row>

Runs the query and returns every row.

Link copied to clipboard
fun fetchRowStrict(params: Map<String, Any?> = emptyMap()): Row
fun fetchRowStrict(vararg params: Pair<String, Any?>): Row

Runs the query and returns its single row, throwing where the count was anything but one.

Link copied to clipboard
inline fun <T> forEachField(params: Map<String, Any?> = emptyMap(), fetchSize: Int, crossinline block: (T) -> Unit)
inline fun <T> forEachField(vararg params: Pair<String, Any?>, fetchSize: Int, crossinline block: (T) -> Unit)

Runs the query and hands the first column of each row, as T, to block as it arrives.

Link copied to clipboard
inline fun <T : Any> forEachObject(params: Map<String, Any?> = emptyMap(), fetchSize: Int, crossinline block: (T) -> Unit)
inline fun <T : Any> forEachObject(vararg params: Pair<String, Any?>, fetchSize: Int, crossinline block: (T) -> Unit)

Runs the query and hands each row, mapped onto T, to block as it arrives.

Link copied to clipboard
fun forEachRow(params: Map<String, Any?> = emptyMap(), fetchSize: Int, block: (Row) -> Unit)
fun forEachRow(vararg params: Pair<String, Any?>, fetchSize: Int, block: (Row) -> Unit)

Runs the query and hands each row to block as it arrives, in batches of fetchSize.

Link copied to clipboard
fun forUpdate(of: String? = null, mode: LockWaitMode? = null): SelectQuery

Locks the selected rows with FOR UPDATE, for a read-then-write that must not race.

Link copied to clipboard
fun from(source: String): SelectQuery

Sets the FROM clause, as SQL.

Link copied to clipboard
fun fromSubquery(subquery: String, alias: String? = null): SelectQuery

Sets the FROM clause to a subquery, parenthesised and optionally aliased.

Link copied to clipboard
fun groupBy(columns: String?): SelectQuery

Sets the GROUP BY columns. null or blank leaves the clause out.

Link copied to clipboard
fun having(condition: String?): SelectQuery

Sets the HAVING condition, which requires a GROUP BY. null or blank leaves the clause out.

Link copied to clipboard
fun limit(count: Long?): SelectQuery

Sets LIMIT. null leaves it out.

Link copied to clipboard
fun offset(position: Long): SelectQuery

Sets OFFSET.

Link copied to clipboard
fun orderBy(ordering: String?): SelectQuery

Sets the ORDER BY clause. null or blank leaves the clause out.

Link copied to clipboard
fun page(page: Long, size: Long): SelectQuery

Sets LIMIT and OFFSET together from a page number and a page size.

Link copied to clipboard

Builds the driver query a terminal is about to run, with this query's own converters on it.

Link copied to clipboard
internal open override fun querySql(): String

Renders the SQL. Called once per terminal call, so a builder may put off assembling it until here.

Link copied to clipboard

Marks the WITH clause RECURSIVE.

Link copied to clipboard

Registers a ParameterConverter for this query and nothing else.

Link copied to clipboard

Registers a ResultConverter for this query and nothing else.

Link copied to clipboard
fun toSql(): String

Renders the SQL this query would send.

Link copied to clipboard
fun update(params: Map<String, Any?> = emptyMap()): Long
fun update(vararg params: Pair<String, Any?>): Long

Runs the statement and returns how many rows it affected.

Link copied to clipboard
fun where(condition: String?): SelectQuery

Sets the WHERE condition. null or blank leaves the clause out.

Link copied to clipboard
fun with(name: String, query: String): SelectQuery

Adds a common table expression. Call it more than once for more than one.