传递斯卡拉选项[列表[_]],用statement.setArray的Java JDBC阵列() [英] Passing Scala Option[List[_]] to Java JDBC Array using statement.setArray()

查看:207
本文介绍了传递斯卡拉选项[列表[_]],用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 作为<一个描述href=\"https://docs.oracle.com/javase/7/docs/api/java/sql/$p$pparedStatement.html#setArray%28int,%20java.sql.Array%29\"相对=nofollow> 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)

这篇关于传递斯卡拉选项[列表[_]],用statement.setArray的Java JDBC阵列()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆