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

pdtvr36n  于 2022-11-25  发布在  Kotlin
关注(0)|答案(1)|浏览(107)

我希望使用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()的方法?

mwg9r5ms

mwg9r5ms1#

为什么传递emptyList<Any>不起作用

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

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

为什么传递null不起作用

当您传递null时,会解析varargs多载,它Map于SQL中的ARRAY[NULL],也就是包含NULL值的数组。

如何调用varargs重载

如果您想使用varargs重载,则只需传递一个空数组:

DSL.array(arrayOf<String>())

因为数组类型在Java中具体化,所以两个varargs重载都存在:

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

关于数组类型

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

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

使用绑定值作为替代

您也可以随时使用bind valuesinline values

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

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

相关问题