【问题标题】:Jooq JsonObject Select All StatementJooq JsonObject 全选语句
【发布时间】: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()”对?

【问题讨论】:

    标签: mysql spring-boot jooq


    【解决方案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 就是其中之一
    猜你喜欢
    • 2014-05-30
    • 2014-08-06
    • 1970-01-01
    • 2018-05-05
    • 2020-12-20
    • 2020-10-21
    • 2018-03-27
    • 2019-04-17
    • 2012-06-17
    相关资源
    最近更新 更多