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 全选语句的主要内容,如果未能解决你的问题,请参考以下文章

解析JSON有俩种方式:JSONObject和GSON

JSONObject 无法转换为字符串

json:JSONObject与JSONArray的使用

java解析json数据

jOOQ JSON 格式化为对象数组

在 Jooq 中创建 VIEW 语句