Jooq JsonObject 全选语句
Posted
技术标签:
【中文标题】Jooq JsonObject 全选语句【英文标题】:Jooq JsonObject Select All Statement 【发布时间】:2022-01-24 06:06:35 【问题描述】:context.select(
jsonObject(
key("id").value(CHAPTER.ID),
key("name").value(CHAPTER.NAME),
key("createdAt").value(CHAPTER.CREATED_AT),
key("topics").value(
jsonArrayAgg(
jsonObject(
key("id").value(TOPIC.ID),
key("name").value(TOPIC.NAME),
key("createdAt").value(TOPIC.CREATED_AT),
)
)
)
)
)
.from(CHAPTER)
.join(TOPIC)
.on(CHAPTER.ID.eq(TOPIC.CHAPTER_ID))
.fetch().into(Chapter.class);
当我实现上面的 jooq 语句时,它工作文件。 在选择语句中,我必须指定表的所有列,如果没有,它们没有被加载到结果中。 有没有什么简单的方法来选择表中的所有列,而不是在 jooq 中使用连接时为每一列编写每个“key().value()”对?
【问题讨论】:
【参考方案1】:您可以使用 jsonObject(Field...)
重载,并像这样使用它:
jsonObject(MY_TABLE.fields())
它将生成字段名称作为 JSON 对象键,这似乎不是您想要的,您似乎想使用驼峰式表示法。您仍然可以使用这种方法动态地执行此操作:
jsonObject(Arrays
.stream(MY_TABLE.fields())
.map(f -> key(toCamelCase(f.getName())).value(f))
.toList()
)
你所要做的就是实现toCamelCase()
辅助方法,或者使用java.beans
模块中的一个,或者来自Spring等。
【讨论】:
如果我只想获取一个表的字段,它可以工作。例如,从您的解决方案中,我得到了章节表 id、名称、createdAt 字段,但“主题”不是章节表中的字段。那么在使用 Arrays.stream(..).. 之后如何添加呢? @SaiUttej:多条道路通向罗马。Stream.concat
就是其中之一以上是关于Jooq JsonObject 全选语句的主要内容,如果未能解决你的问题,请参考以下文章