我想使用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所知,您不再需要显式地强制转换它。