我希望使用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()
的方法?
1条答案
按热度按时间mwg9r5ms1#
为什么传递
emptyList<Any>
不起作用接受
DSL.array()
重载的Collection
需要一个Collection<? extends Field<T>>
,即列表达式的集合,而不是一个Collection<? extends T>
,它将是绑定值的集合。由于通常的类型擦除原因,我们不能同时使用两个重载,因此只提供了更通用的版本。但是您传递的是List<Any>
,而不是List<Field<*>>
。您可以将代码更改为:为什么传递
null
不起作用当您传递
null
时,会解析varargs多载,它Map于SQL中的ARRAY[NULL]
,也就是包含NULL
值的数组。如何调用varargs重载
如果您想使用varargs重载,则只需传递一个空数组:
因为数组类型在Java中具体化,所以两个varargs重载都存在:
array(T...)
:接受绑定值array(Field<T>...)
:接受列表达式关于数组类型
如果使用PostgreSQL,则可能需要将数组表达式显式转换为
SQLDataType.VARCHAR.getArrayDataType()
使用绑定值作为替代
您也可以随时使用bind values或inline values:
在这种情况下,jOOQ知道数组类型,您不再需要显式转换它。