spring - 使用 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 一起使用
解决方案
虽然我无法使用各种 PostgreSQL 服务器和 JDBC 驱动程序版本重现此问题,但这里的简单解决方法是用于防止 jOOQ 为函数参数DSL.inline(String)
生成绑定变量:json_build_object()
jsonEntry(inline("name"), field("books.name"))
推荐阅读
- database - 有效更新 Firestore Flutter 中的数据并防止多次写入
- python - 我无法在 FourSquare API 中获取类别和层次结构
- database - 《部落冲突》和其他游戏如何有效地对玩家进行排名和匹配?
- qt - 如何在 gnome centos 7 上配置新会话以仅运行我的 qml 界面?
- c++ - 检查 std::shared_ptr<> 的当前底层类型是否为 T
- c - 试图理解我的代码中的错误
- c++ - 多个文件的内存分配错误“在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用” [C ++]
- ruby-on-rails - 尝试将更新的 Rails 应用程序部署到 Heroku 时出错 - /bin/bundle:无法执行二进制文件:执行格式错误
- python - 按位置重命名所有列名
- r - 使用聚合时如何在 R 中保留原始变量名称?