1

Scala から JDBC callableStatements へのインターフェースを構築しようとしています。を除いて、ほとんどの場合、それは簡単ですLists

何らかのタイプの Scala を取り、Listそれを渡せる 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, ???? )
    ...

単純な値の場合は非常に簡単ですが、setArray()呼び出しに関しては行き詰まっています。

アドバイスをいただければ幸いです。これで何時間も立ち往生...

4

1 に答える 1

5

setArrayドキュメントでjava.sql.Array説明されているよう

void setArray(int parameterIndex, Array x)
          throws SQLException

次のものを使用して作成できます。

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

タイプは次のとおりです。

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

必要に応じて、例と説明についてこのドキュメントを参照してください。

結論: 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)))
                               ^

リストを配列に変換するには、次のようにします。

scala> List(1, 2, 3).toArray
res6: Array[Int] = Array(1, 2, 3)
于 2015-05-28T06:10:59.977 に答える