使用 statement.setArray() 将 Scala Option[List[_]] 传递给 Java JDBC Array

Zac*_*Zac 1 java arrays scala jdbc callable-statement

我正在尝试构建从 Scala 到 JDBC callableStatements 的接口。在大多数情况下,它很简单,除了Lists.

我需要能够采用List某种类型的 Scala ,并将其转换为可以传递给的 Java 数组,statement.setArray(type, array)但我没有任何运气(部分是因为我不太了解 Java 和 JDBC)。

这是我想要做的:

for (parameter <- ps.parameters) {
    case GPArrayIn(None, t) => callableStatement.setNull(index, t)
    case GPIn(v: Some[_], Types.INTEGER) => callableStatement.setInt(index, v.get.asInstanceOf[Int])
    case GPIn(v: Some[_], Types.VARCHAR | Types.LONGVARCHAR) => callableStatement.setString(index, v.get.asInstanceOf[String])
    case GPArrayIn(v: Some[List[_]], Types.INTEGER) => callableStatement.setArray(Types.INTEGER, ???? )
    case GPArrayIn(v: Some[List[_]], Types.VARCHAR | Types.LONGVARCHAR) => callableStatement.setArray(Types.VARCHAR, ???? )
    ...
Run Code Online (Sandbox Code Playgroud)

对于简单的值,这非常简单,但是当涉及到setArray()调用时,我被卡住了。

任何建议将不胜感激。被困在这几个小时......

yǝs*_*ǝla 5

setArray需要一个java.sql.Array文档中所述:

void setArray(int parameterIndex, Array x)
          throws SQLException
Run Code Online (Sandbox Code Playgroud)

您可以创建一个:

sqlArray = connection.createArrayOf("VARCHAR", regularJavaArray);
Run Code Online (Sandbox Code Playgroud)

这是类型:

Array createArrayOf(String typeName, Object[] elements)
                throws SQLException
Run Code Online (Sandbox Code Playgroud)

如果需要,请参阅文档以获取示例和说明。

底线:如果 Scala 集合还不是数组,则需要将其转换为 java 数组,然后使用createArrayOf. 它将该数据映射到 SQL ARRAY 会做一些幕后魔法。

至于模式匹配和提取,你可以使用这样的东西:

scala> val numbers = Array(1, 2, 3, 4)
numbers: Array[Int] = Array(1, 2, 3, 4)

scala> def arrayMatcher[T](maybeArray:  Option[Array[T]]): String =
     |     maybeArray match {
     |       case Some(a: Array[Int]) => a.mkString(",")
     |       case Some(b: Array[String]) => b.mkString("-")
     |       case None => "no array"
     |       case _ => "no match"
     |     }
arrayMatcher: [T](maybeArray: Option[Array[T]])String

scala> arrayMatcher(Some(numbers))
res0: String = 1,2,3,4

scala> arrayMatcher(None)
res1: String = no array

scala> arrayMatcher(Some(numbers map(_.toString)))
res2: String = 1-2-3-4

scala> arrayMatcher(Some(Array(1.2, 3.4)))
res3: String = no match

scala> arrayMatcher(Some(List(1, 2)))
<console>:9: error: type mismatch;
 found   : Some[List[Int]]
 required: Option[Array[?]]
              arrayMatcher(Some(List(1, 2)))
                               ^
Run Code Online (Sandbox Code Playgroud)

要将列表转换为数组,请使用:

scala> List(1, 2, 3).toArray
res6: Array[Int] = Array(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)