使用 JooQ 获取一对多关联

Posted

技术标签:

【中文标题】使用 JooQ 获取一对多关联【英文标题】:Fetching One to Many associations with JooQ 【发布时间】:2021-02-17 05:10:40 【问题描述】:

我正在尝试按照 post 反序列化与 JooQ 的一对多关联(不生成代码)。

这是我的目标类。

public class Author 
    private Long id;
    private String name;
    private List<Book> books;


public class Book 
   private String name;

我的 JooQ 查询如下:

dslContext
            .select(table("authors").asterisk(),
                    field(
                      select(jsonArrayAgg(
                                   jsonObject(
                                       jsonEntry("name", field("books.name")))))
                      .from(table("books"))
                      .join(table("authors"))                        
                      .on(field("books.author_id").eq(field("authors.id")))
                      .where(field("emails.collection_case_id")
                        .eq(field("collection_cases.id")))
                    ).as("books"))
            .from(table("authors"))
            .where(trueCondition())
            .fetchInto(Author.class);

jsonObject() 方法对我来说无法正常工作。生成的 SQL 语句如下所示:

select authors.*, (select json_agg(json_build_object(?, books.name)) from books join authors ...

翻译后的 postgres 查询没有正确替换 json_build_object 的 key 属性,这导致 SQL 异常。

PS:我正在使用 JooQ 3.14.0 和 postgres 11.5

【问题讨论】:

请查看此帖子blog.jooq.org/tag/json 你为什么不使用代码生成器(可能不相关,但为了上下文)?您得到的异常和堆栈跟踪是什么? @LukasEder 我收到 SQL 语法异常:org.postgresql.util.PSQLException:错误:无法确定参数 $1 的数据类型 如果我手动更新 json_build_object(?, books. name) 与 json_build_object('name', books.name) @LukasEder 我们正在尝试将 JooQ 用于一个新的功能部件,并且不想仅仅为了这个实验而干扰现有的 JPA 实体。这就是我们没有真正使用代码生成的原因。 @Vijithmv:关于代码生成,不应该有任何“干扰”。你甚至可以use JPA entities as a source for your code generation。通过代码生成,您将从 jOOQ 中获得更多。我会调查这个问题。一种解决方法是使用DSL.inline("name") 来避免绑定变量。 【参考方案1】:

虽然我无法使用各种 PostgreSQL 服务器和 JDBC 驱动程序版本重现此问题,但这里的简单解决方法是使用 DSL.inline(String) 来防止 jOOQ 为 json_build_object() 函数参数生成绑定变量:

jsonEntry(inline("name"), field("books.name"))

【讨论】:

以上是关于使用 JooQ 获取一对多关联的主要内容,如果未能解决你的问题,请参考以下文章

jooq 具有一对多关系的单个查询

如何使用 Apache DbUtils 获取一对多关联和父子类型关联?

具有一对多和多对多关系的 JOOQ pojos

laravel的模型关联之(一对多的反向)

laravel中的模型关联之(一对多)

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联