首页 > 解决方案 > 使用 JooQ 获取一对多关联

问题描述

根据这篇文章,我正在尝试反序列化与 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 查询没有正确替换的 key 属性,json_build_object这导致 SQL 异常。

PS:我将 JooQ 3.14.0 与 postgres 11.5 一起使用

标签: springpostgresqlspring-bootjpajooq

解决方案


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

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

推荐阅读