Kotlin 如果字段为空,则使用默认值的Jooq FETCHITO

Kotlin 如果字段为空,则使用默认值的Jooq FETCHITO,kotlin,jooq,data-class,Kotlin,Jooq,Data Class,我有数据类 data class Author( val id: String, val name: String, val books: MutableList<Book> = mutableListOf() ) {} companion object { operator fun invoke( id: String, name: String, books: Mut

我有数据类

data class Author(
    val id: String,
    val name: String,
    val books: MutableList<Book> = mutableListOf()
) {}
companion object {
        operator fun invoke(
            id: String,
            name: String,
            books: MutableList<Book>? = null
        ) = Author(id, name, books ?: mutableListOf())
    }
但我有一个例外,若作者并没有书。这是合乎逻辑的,因为数据类Author中的外业手簿不可为空。我试图将伴生对象添加到数据类中

data class Author(
    val id: String,
    val name: String,
    val books: MutableList<Book> = mutableListOf()
) {}
companion object {
        operator fun invoke(
            id: String,
            name: String,
            books: MutableList<Book>? = null
        ) = Author(id, name, books ?: mutableListOf())
    }
伴生对象{
运算符乐趣调用(
id:String,
名称:String,
书籍:可变列表?=空
)=作者(id、姓名、书籍?:mutableListOf())
}

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

原因是
JSON_ARRAYAGG()
(与大多数聚合函数一样)为空集生成
NULL
,而不是更“合理”的空
[]
。显然,你永远不会想要这种行为。所以

合并(
jsonArrayAgg(jsonObject(book.ID,book.PRICE)),
jsonArray()
)
我将确保更新我在堆栈溢出问题上给出的所有其他答案,以指出这一点。如果存在合理的聚合标识(例如,
[]
),未来的jOOQ版本可能会提供
NULL
安全聚合函数,以使其更易于发现: