如果字段为空,则 Jooq fetchInto 具有默认值
Jooq fetchInto with default value if field is null
我有数据class
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)
但是如果作者没有书,我会得到一个例外。这是合乎逻辑的,因为 data class Author 中的 field books 不可为空。我试图将伴随对象添加到数据 class
companion object {
operator fun invoke(
id: String,
name: String,
books: MutableList<Book>? = null
) = Author(id, name, books ?: mutableListOf())
}
但是它不起作用,jooq 仍然尝试使用默认构造函数并且我得到一个异常。有没有办法在不在数据 class 作者可为空的情况下制作实地书籍的情况下修复它?
原因是 JSON_ARRAYAGG()
(像大多数聚合函数一样)为空集生成 NULL
,而不是更“合理”的空集 []
。显然,您永远不想要这种行为。所以,:
coalesce(
jsonArrayAgg(jsonObject(book.ID, book.PRICE)),
jsonArray()
)
我会确保更新我在 Stack Overflow 上给出的所有其他答案以指出这一点。未来的 jOOQ 版本可能会提供 NULL
安全的聚合函数,以防存在合理的聚合标识(例如 []
)以使其更容易被发现:https://github.com/jOOQ/jOOQ/issues/11994
我有数据class
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)
但是如果作者没有书,我会得到一个例外。这是合乎逻辑的,因为 data class Author 中的 field books 不可为空。我试图将伴随对象添加到数据 class
companion object {
operator fun invoke(
id: String,
name: String,
books: MutableList<Book>? = null
) = Author(id, name, books ?: mutableListOf())
}
但是它不起作用,jooq 仍然尝试使用默认构造函数并且我得到一个异常。有没有办法在不在数据 class 作者可为空的情况下制作实地书籍的情况下修复它?
原因是 JSON_ARRAYAGG()
(像大多数聚合函数一样)为空集生成 NULL
,而不是更“合理”的空集 []
。显然,您永远不想要这种行为。所以,
coalesce(
jsonArrayAgg(jsonObject(book.ID, book.PRICE)),
jsonArray()
)
我会确保更新我在 Stack Overflow 上给出的所有其他答案以指出这一点。未来的 jOOQ 版本可能会提供 NULL
安全的聚合函数,以防存在合理的聚合标识(例如 []
)以使其更容易被发现:https://github.com/jOOQ/jOOQ/issues/11994