Skip to content
Advertisement

jOOQ can I fetch a join of two tables into the respective POJOs

In jOOQ if I want to fetch a row of a table into a jOOQ autogenerated POJOs I do, for instance:

JavaScript

Now, suppose that I want to do a join between two tables, e.g. USER and ROLE, how can I fetch the result into the POJOs for these two tables?

Advertisement

Answer

Using nested collections

With more recent versions of jOOQ, you’ll typically use a set of ORDBMS features, including:

You’ll write something like this, to produce jOOQ types:

JavaScript

Or, by using said ad-hoc converters, to produce your own types:

JavaScript

Historic answers / alternatives

There are other ways to achieve something like the above, for completeness’ sake:

Fetching the POJOs into a Map

This is one solution using ResultQuery.fetchGroups(RecordMapper, RecordMapper)

JavaScript

Note, if you want to use LEFT JOIN instead (in case a user does not necessarily have any roles, and you want to get an empty list per user), you’ll have to translate NULL roles to empty lists yourself.

Make sure you have activated generating equals() and hashCode() on your POJOs in order to be able to put them in a HashMap as keys:

JavaScript

Using custom, hierarchical POJOs and fetching them into a nested collection

A frequently re-occurring question is how to fetch nested collections in jOOQ, i.e. what if your result data structures look like this:

JavaScript

Starting with jOOQ 3.14, and if your RDBMS supports it, you can now use SQL/XML or SQL/JSON as an intermediary format to nest collections, and then use Jackson, Gson, or JAXB to map the document back to your Java classes (or keep the XML or JSON, if that’s what you needed in the first place). For example:

JavaScript

Note that JSON_ARRAYAGG() aggregates empty sets into NULL, not into an empty []. If that’s a problem, use COALESCE()

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement