jOOQ:如何在 Kotlin 中选择空数组"[]"



我想使用jOOQ的DSL生成本质上相当于array[][]的SQL,以便在方言之间可移植。

不幸的是,在Kotlin中,这些都不起作用:

// Overload resolution ambiguity. All these functions match.
// public open fun <T : Any!> array(vararg values: TypeVariable(T)!): Field<Array<(out) TypeVariable(T)!>!> defined in org.jooq.impl.DSL
// public open fun <T : Any!> array(vararg fields: Field<TypeVariable(T)!>!): Field<Array<(out) TypeVariable(T)!>!> defined in org.jooq.impl.DSL
DSL.array()
DSL.array(null as Any?)      // Produces a non-empty array
DSL.array(emptyList<Any>())  // Produces a non-empty array

是否有办法做到这一点,或者像DSL.emptyArray()方法?

为什么通过emptyList<Any>不工作

Collection接受DSL.array()的重载,期望Collection<? extends Field<T>>,即列表达式的集合,而不是Collection<? extends T>,这将是一个绑定值的集合。由于通常的类型擦除原因,我们不能同时使用两个重载,因此只提供更通用的版本。但你通过的是List<Any>,不是List<Field<*>>。您可以将代码更改为:

DSL.array(emptyList<Field<*>>())

为什么通过null不工作

当你传递null时,变量过载被解决,对应于SQL中的ARRAY[NULL],一个包含NULL值的数组。

如何调用变量重载

如果你想处理变量重载,那么只需传递一个空数组:

DSL.array(arrayOf<String>())

由于Java中对数组类型进行了定义,因此存在两个变量重载:

  • array(T...):接受绑定值
  • array(Field<T>...):接受列表达式

关于数组类型

如果你使用的是PostgreSQL,你可能需要将数组表达式显式转换为SQLDataType.VARCHAR.getArrayDataType()

DSL.array(arrayOf<String>()).cast(SQLDataType.VARCHAR.getArrayDataType())

使用绑定值作为替代

你总是可以使用绑定值或内联值:

DSL.value(arrayOf<String>())
DSL.inline(arrayOf<String>())

在这种情况下,数组类型为jOOQ所知,您不再需要显式地强制转换它。

最新更新