Available in versions: Dev (3.20) | Latest (3.19) | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11 | 3.10

This documentation is for the unreleased development version of jOOQ. Click on the above version links to get this documentation for a supported version of jOOQ.


Applies to ✅ Open Source Edition   ✅ Express Edition   ✅ Professional Edition   ✅ Enterprise Edition

In a more functional operating mode, you might want to write callbacks that map records from your select statement results in order to do some processing. This is a common data access pattern in Spring's JdbcTemplate, and it is also available in jOOQ. With jOOQ, you can implement your own org.jooq.RecordMapper classes and plug them into jOOQ's org.jooq.ResultQuery:

// Write callbacks to receive records from select statements
List<Integer> ids =

// Or more concisely, as fetch().map(mapper) can be written as fetch(mapper):

// Or using a lambda expression:
      .fetch(book -> book.getId());

// Of course, the lambda could be expanded into the following anonymous RecordMapper:
      .fetch(new RecordMapper<BookRecord, Integer>() {
          public Integer map(BookRecord book) {
              return book.getId();

An alternative utility is offered by org.jooq.Records, which is very useful when working with type safe Record[N] types and constructor references:

// Use Java 16 record types as simple DTOs
record Book (int id, String title) {}

List<Book> ids =
create.select(BOOK.ID, BOOK.TITLE)

Your custom RecordMapper types can be used automatically through jOOQ's POJO mapping APIs, by injecting a RecordMapperProvider into your Configuration.

See also the manual's section about the RecordHandler, which provides similar features


Do you have any feedback about this page? We'd love to hear it!

The jOOQ Logo