jOOQ implements your SQL statements as AST (Abstract Syntax Tree). This means that your SQL statement is modelled in a non-text form prior to serialising it as a textual SQL statement to your JDBC driver.
One advantage of this is that you can freely manipulate this AST any way you want. This can be done using jOOQ’s SQL transformation capabilities, or in some cases much more simply directly in your client code.
Imagine, for instance, that you have a SQL statement where several bind values should be identical. This is a frequent problem in SQL, as SQL is verbose and repetitive. For instance:
-- Both "1" should in fact be the same value SELECT 1 FROM TABLE WHERE TABLE.COL < 1 -- Both "2" should in fact be the same value SELECT 2 FROM TABLE WHERE TABLE.COL < 2
With jOOQ, what you can do is this:
// Create a single bind value reference Param<Integer> value = val(1); // And use that reference several times in your query: Select<?> query = DSL.using(configuration) .select(value.as("a")) .from(TABLE) .where(TABLE.COL.lt(value)); assertEquals(1, (int) query.fetchOne("a")); // Now, for the second query, simply change the value value.setValue(2); // ... and execute the query again assertEquals(2, (int) query.fetchOne("a"));
As a jOOQ developer, you’re directly manipulating your SQL statement’s AST. Nothing keeps you from turning that AST into a directed graph (beware of cycles, of course), to improve your SQL expressiveness.