传递斯卡拉选项[列表[_]],用statement.setArray的Java JDBC阵列()

传递斯卡拉选项[列表[_]],用statement.setArray的Java JDBC阵列()

问题描述:

我试图建立从斯卡拉JDBC CallableStatements中的接口。在大多数情况下,它的简单,除了列表

I'm trying to build an interface from Scala to JDBC callableStatements. For the most part, it's straightforward, except for Lists.

我需要能够采取一些类型的斯卡拉列表,并将其转换成可以传递到语句的Java数组。 setArray(类型,数组)和我没有任何运气(部分原因是因为我不知道Java和JDBC非常好)。

I need to be able to take a Scala List of some type, and convert it into a Java Array that can be passed to statement.setArray(type, array) and I'm not having any luck (partly because I don't know Java and JDBC very well).

下面就是我想要做的:

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, ???? )
    ...

这是pretty直白简单的值,但是当涉及到​​ setArray()呼叫我卡住了。

任何意见将是非常美联社preciated。一直停留在本作的小时...

Any advice would be sorely appreciated. Been stuck on this for hours...

setArray 需要了java.sql.Array 作为 DOC :

void setArray(int parameterIndex, Array x)
          throws SQLException

您可以创建一个有:

sqlArray = connection.createArrayOf("VARCHAR", regularJavaArray);

这是类型:

Array createArrayOf(String typeName, Object[] elements)
                throws SQLException

如果需要请参见文档的实例和解释。

See this doc for examples and explanation if needed.

底线:你需要收集斯卡拉转换成Java数组,如果它不是已经是一个数组,然后将其转换Java数组到SQL阵列使用 createArrayOf 。它会做一些神奇的引擎盖下的映射数据,SQL ARRAY。

Bottom line: you need to convert Scala collection to java array if it's not an array already, then convert that Java array to SQL array using createArrayOf. It will do some under the hood magic to map that data to SQL ARRAY.

对于模式匹配和提取,可以使用这样的事情:

As for the pattern matching and extraction, you can use something like that:

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)))
                               ^

要列表转换到阵列中使用:

To convert a list to array use:

scala> List(1, 2, 3).toArray
res6: Array[Int] = Array(1, 2, 3)