MCPcopy
hub / github.com/jOOQ/jOOQ

github.com/jOOQ/jOOQ @version-3.21.6 sqlite

repository ↗ · DeepWiki ↗ · release version-3.21.6 ↗
31,695 symbols 101,308 edges 2,671 files 12,786 documented · 40%
README

jOOQ

jOOQ is an internal DSL and source code generator, modelling the SQL language as a type safe Java API to help you write better SQL.

Its main features include:

Secondary features include:

Examples

Typesafe, embedded SQL

jOOQ's main feature is typesafe, embedded SQL, allowing for IDE auto completion of SQL syntax...

image

... as well as of schema meta data:

image

This allows for preventing errors of various types, including typos of identifiers:

image

Or data type mismatches:

image

The examples are from the code generation blog post.

A more powerful example using nested collections

For many more examples, please have a look at the demo. A key example showing jOOQ's various strengths is from the MULTISET operator announcement blog post:

Given these target DTOs:

record Actor(String firstName, String lastName) {}
record Film(
  String title,
  List<Actor> actors,
  List<String> categories
) {}

You can now write the following query to fetch films, their nested actors and their nested categorise in a single, type safe query:

List<Film> result =
dsl.select(
      FILM.TITLE,
      multiset(
        select(
          FILM.actor().FIRST_NAME, 
          FILM.actor().LAST_NAME)
        .from(FILM.actor())
      ).as("actors").convertFrom(r -> r.map(mapping(Actor::new))),
      multiset(
        select(FILM.category().NAME)
        .from(FILM.category())
      ).as("categories").convertFrom(r -> r.map(Record1::value1))
   )
   .from(FILM)
   .orderBy(FILM.TITLE)
   .fetch(mapping(Film::new));

The query is completely type safe. Change a column type, name, or the target DTO, and it will stop compiling! Trust only your own eyes:

multiset

And here you see the nested result in action from the logs:

execute

How does it work? Look at this annotated example:

List<Film> result =
dsl.select(
      FILM.TITLE,

      // MULTISET is a standard SQL operator that allows for nesting collections
      // directly in SQL. It is either
      // - supported natively
      // - emulated using SQL/JSON or SQL/XML
      multiset(

        // Implicit path based joins allow for simpler navigation of foreign
        // key relationships.
        select(
          FILM.actor().FIRST_NAME, 
          FILM.actor().LAST_NAME)

        // Implicit correlation to outer queries allows for avoiding repetitive
        // writing of predicates.
        .from(FILM.actor())

      // Ad-hoc conversion allows for mapping structural Record2<String, String>
      // types to your custom DTO using constructor references
      ).as("actors").convertFrom(r -> r.map(mapping(Actor::new))),
      multiset(
        select(FILM.category().NAME)
        .from(FILM.category())
      ).as("categories").convertFrom(r -> r.map(Record1::value1))
   )
   .from(FILM)
   .orderBy(FILM.TITLE)
   .fetch(mapping(Film::new));

The generated SQL query might look like this, in PostgreSQL:

select
  film.title,
  (
    select coalesce(
      jsonb_agg(jsonb_build_object(
        'first_name', t.first_name,
        'last_name', t.last_name
      )),
      jsonb_build_array()
    )
    from (
      select
        alias_78509018.first_name, 
        alias_78509018.last_name
      from (
        film_actor
          join actor as alias_78509018
            on film_actor.actor_id = alias_78509018.actor_id
        )
      where film_actor.film_id = film.film_id
    ) as t
  ) as actors,
  (
    select coalesce(
      jsonb_agg(jsonb_build_object('name', t.name)),
      jsonb_build_array()
    )
    from (
      select alias_130639425.name
      from (
        film_category
          join category as alias_130639425
            on film_category.category_id = alias_130639425.category_id
        )
      where film_category.film_id = film.film_id
    ) as t
  ) as categories
from film
order by film.title

This particular example is explained more in detail in the MULTISET operator announcement blog post. For many more examples, please have a look at the demo.

Extension points exported contracts — how you extend this code

ConditionProvider (Interface)
A common interface for all objects holding conditions (e.g. queries). @author Lukas Eder @deprecated - 2.6.0 [#1881] - [7 …
jOOQ/src/main/java/org/jooq/ConditionProvider.java
CatalogVersionProvider (Interface)
An SPI that can be used to provide a catalog version to the jOOQ code generator. If between subsequent meta data acc [8 …
jOOQ-meta/src/main/java/org/jooq/meta/CatalogVersionProvider.java
Range (Interface)
A RANGE type. [1 implementers]
jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Range.java
GeneratorStrategy (Interface)
A strategy for naming various artefacts generated from Definition's @author Lukas Eder [1 implementers]
jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java
Record1 (Interface)
A model type for a records with degree 1 @see Row1 @author Lukas Eder [22 implementers]
jOOQ/src/main/java/org/jooq/Record1.java
TableElementDefinition (Interface)
The definition of an object that is contained in a table. @author Lukas Eder [21 implementers]
jOOQ-meta/src/main/java/org/jooq/meta/TableElementDefinition.java
Generator (Interface)
The Generator provides a basic interface for java code generation @author Lukas Eder [1 implementers]
jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java
Record8 (Interface)
A model type for a records with degree 8 @see Row8 @author Lukas Eder [15 implementers]
jOOQ/src/main/java/org/jooq/Record8.java

Core symbols most depended-on inside this repo

field
called by 2983
jOOQ/src/main/java/org/jooq/impl/Tools.java
name
called by 2912
jOOQ/src/main/java/org/jooq/impl/DSL.java
visit
called by 2836
jOOQ/src/main/java/org/jooq/Context.java
equals
called by 2724
jOOQ/src/main/java/org/jooq/Name.java
inline
called by 2461
jOOQ/src/main/java/org/jooq/impl/DSL.java
createField
called by 2149
jOOQ/src/main/java/org/jooq/impl/UDTImpl.java
sql
called by 2118
jOOQ/src/main/java/org/jooq/Context.java
dataType
called by 2069
jOOQ/src/main/java/org/jooq/impl/FieldsTrait.java

Shape

Method 28,331
Class 1,893
Interface 1,296
Enum 175

Languages

Java100%

Modules by API surface

jOOQ/src/main/java/org/jooq/impl/QOM.java1,352 symbols
jOOQ/src/main/java/org/jooq/conf/Settings.java776 symbols
jOOQ/src/main/java/org/jooq/impl/DSL.java567 symbols
jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/MetaExtensions.java533 symbols
jOOQ/src/main/java/org/jooq/impl/ParserImpl.java503 symbols
jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java416 symbols
jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java383 symbols
jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java316 symbols
jOOQ/src/main/java/org/jooq/impl/Tools.java301 symbols
jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java297 symbols
jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java292 symbols
jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java291 symbols

Used by 2 indexed graphs manifest dependencies, hub-wide

Dependencies from manifests, versioned

biz.aQute.bnd:biz.aQute.bndlib
com.fasterxml.jackson.core:jackson-core
com.fasterxml.jackson.datatype:jackson-datatype-jsr310
com.fasterxml.jackson.module:jackson-module-kotlin
com.google.auto.service:auto-service1.0-rc6 · 1×
com.google.auto.service:auto-service-annotations1.0-rc6 · 1×
com.google.errorprone:error_prone_annotation
com.google.errorprone:error_prone_core
com.google.errorprone:error_prone_refaster
com.h2database:h2

Datastores touched

(mysql)Database · 1 repos

For agents

$ claude mcp add jOOQ \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact