【发布时间】: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")来避免绑定变量。
标签: spring postgresql spring-boot jpa jooq