使用 statement.setArray() 将 Scala Option[List[_]] 传递给 Java JDBC 数组
Passing Scala Option[List[_]] to Java JDBC Array using statement.setArray()
我正在尝试构建一个从 Scala 到 JDBC callableStatements 的接口。在大多数情况下,它很简单,除了 Lists
.
我需要能够采用某种类型的 Scala List
,并将其转换为可以传递给 statement.setArray(type, array)
的 Java 数组,但我没有运气好(部分原因是我不太了解 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()
调用时我就卡住了。
如有任何建议,我们将不胜感激。一直坚持 小时...
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
如有需要,请参阅 this 文档以获取示例和解释。
底线:如果 Scala 集合还不是数组,则需要将其转换为 java 数组,然后使用 createArrayOf
将该 Java 数组转换为 SQL 数组.它将在引擎盖下做一些魔术,将该数据映射到 SQL 数组。
至于模式匹配和提取,你可以使用类似的东西:
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)
我正在尝试构建一个从 Scala 到 JDBC callableStatements 的接口。在大多数情况下,它很简单,除了 Lists
.
我需要能够采用某种类型的 Scala List
,并将其转换为可以传递给 statement.setArray(type, array)
的 Java 数组,但我没有运气好(部分原因是我不太了解 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()
调用时我就卡住了。
如有任何建议,我们将不胜感激。一直坚持 小时...
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
如有需要,请参阅 this 文档以获取示例和解释。
底线:如果 Scala 集合还不是数组,则需要将其转换为 java 数组,然后使用 createArrayOf
将该 Java 数组转换为 SQL 数组.它将在引擎盖下做一些魔术,将该数据映射到 SQL 数组。
至于模式匹配和提取,你可以使用类似的东西:
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)