【问题标题】:Jooq fetchInto with default value if field is null如果字段为空,则 Jooq fetchInto 具有默认值
【发布时间】:2021-08-27 22:50:44
【问题描述】:

我有数据类

data class Author(
    val id: String,
    val name: String,
    val books: MutableList<Book> = mutableListOf()
) {}

我使用 jooq 写了请求

val resultSet = dsl.select(author.ID, author.NAME,
            field(select(jsonArrayAgg(jsonObject(book.ID, book.PRICE)))
                .from(books)
                .where(book.AUTHOR_ID.eq(author.ID))
            ).`as`("books"))
            .from(authors)
            .fetchInto(Author::class.java)

但如果作者没有书,我会得到一个例外。这是合乎逻辑的,因为数据类 Author 中的外业簿不可为空。我试图将伴随对象添加到数据类

companion object {
        operator fun invoke(
            id: String,
            name: String,
            books: MutableList<Book>? = null
        ) = Author(id, name, books ?: mutableListOf())
    }

但它不起作用,jooq 仍然尝试使用默认构造函数,我得到一个异常。有没有办法在不使数据类 Author 中的外业手册可以为空的情况下修复它?

【问题讨论】:

    标签: kotlin jooq data-class


    【解决方案1】:

    原因是JSON_ARRAYAGG()(像大多数聚合函数一样)为空集生成NULL,而不是更“合理”的空[]。显然,您永远不会想要这种行为。所以,you could use COALESCE, instead, see also this question

    coalesce(
      jsonArrayAgg(jsonObject(book.ID, book.PRICE)),
      jsonArray()
    )
    

    我会确保更新我在 Stack Overflow 上给出的所有其他答案以指出这一点。未来的 jOOQ 版本可能会提供 NULL 安全聚合函数,以防存在合理的聚合标识(例如 [])以使其更容易被发现:https://github.com/jOOQ/jOOQ/issues/11994

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-09
      • 2021-12-19
      • 2021-09-01
      • 2019-04-13
      • 2012-12-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      相关资源
      最近更新 更多