Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用statement.setArray()将Scala选项[List[]]传递给Java JDBC数组_Java_Arrays_Scala_Jdbc_Callable Statement - Fatal编程技术网

使用statement.setArray()将Scala选项[List[]]传递给Java JDBC数组

使用statement.setArray()将Scala选项[List[]]传递给Java JDBC数组,java,arrays,scala,jdbc,callable-statement,Java,Arrays,Scala,Jdbc,Callable Statement,我试图构建一个从Scala到JDBC callableStatements的接口。除了列表之外,它在大多数情况下都很简单 我需要能够获取某种类型的ScalaList,并将其转换为可以传递给statement.setArray(type,Array)的Java数组,我没有任何运气(部分原因是我不太了解Java和JDBC) 以下是我想做的: for (parameter <- ps.parameters) { case GPArrayIn(None, t) => callable

我试图构建一个从Scala到JDBC callableStatements的接口。除了
列表
之外,它在大多数情况下都很简单

我需要能够获取某种类型的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, ???? )
    ...
参数callableStatement.setNull(索引,t)的 case-GPIn(v:Some[\u]、Types.INTEGER)=>callableStatement.setInt(index,v.get.asInstanceOf[Int]) 案例GPIn(v:Some[|]、Types.VARCHAR | Types.LONGVARCHAR)=>callableStatement.setString(index,v.get.asInstanceOf[String]) 案例GPArrayIn(v:Some[List[]],Types.INTEGER)=>callableStatement.setArray(Types.INTEGER,?) 案例GPArrayIn(v:Some[List[]],Types.VARCHAR | Types.LONGVARCHAR)=>callableStatement.setArray(Types.VARCHAR,?) ... 对于简单的值,这非常简单,但是当涉及到
setArray()
调用时,我就卡住了


如果您有任何建议,我们将不胜感激。您已经为此困扰了好几个小时了…

setArray
采用了
java.sql.Array
,如下所述:

您可以通过以下方式创建一个:

sqlArray = connection.createArrayOf("VARCHAR", regularJavaArray);
属于以下类型:

Array createArrayOf(String typeName, Object[] elements)
                throws SQLException
如需示例和解释,请参见文件

一句话:如果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)))
                               ^

setArray
采用
java.sql.Array
格式,如中所述:

您可以通过以下方式创建一个:

sqlArray = connection.createArrayOf("VARCHAR", regularJavaArray);
属于以下类型:

Array createArrayOf(String typeName, Object[] elements)
                throws SQLException
如需示例和解释,请参见文件

一句话:如果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)))
                               ^

谢谢…我知道这一点(尽管您使用
createArrayOf(string,array)
,而我使用的是
createArrayOf(intType,array)
–不确定这是否是一个重要的区别。问题是,我似乎无法获得我的选项[List[\u]]实例转换为Java数组。这是我主要关注的部分。感谢您确认Java/JDBC端是如何工作的。哦,您的意思是模式本身与提取匹配吗?这让我更接近了……不幸的是,只需将Scala
Array
传递给JDBC的
createArray()
不起作用…尝试使用
asInstanceOf[java.sql.Array]
进行强制转换,但结果是
java.lang.ClassCastException:[Ljava.lang.Object;无法转换为java.sql.Array
…仍在使用它。Scala数组可以用来代替java数组。但是,在您的情况下,您需要
java.sql.Array
,它与普通java数组
[]
。因此,正如我在回答中所解释的,您需要将scala/java数组转换为
java.sql.array
。是的……这是非常重要的。我们将此发布到了support,并获得了以下关于如何进行转换的信息:
callableStatement.setArray(index,callableStatement.getConnection.createArrayOf(“NUMERIC”,v.get.toArray[Any].asInstanceOf[Array[AnyRef]])
,尽管我们仍在努力实现它。谢谢……我知道这一点(尽管您使用
createArrayOf(string,Array)
,而我使用的是
createArrayOf(intType,Array)
——不确定这是否是一个重要的区别。问题是,我似乎无法获得我的选项[List[]实例转换为Java数组。这是我主要关注的部分。感谢您确认Java/JDBC端是如何工作的。哦,您的意思是模式本身与提取匹配吗?这让我更接近了……不幸的是,只需将Scala
Array
传递给JDBC的
createArray()
不起作用…尝试使用
asInstanceOf[java.sql.Array]
进行强制转换,但结果是
java.lang.ClassCastException:[Ljava.lang.Object;无法转换为java.sql.Array
…仍在使用它。Scala数组可以用来代替java数组。但是,在您的情况下,您需要
java.sql.Array
,它与普通java数组
[]
。因此,正如我在回答中所解释的,您需要将scala/java数组转换为
java.sql.array
。是的……这是非常重要的。我们将此发布到了support,并获得了以下关于如何进行转换的信息:
callableStatement.setArray(index,callableStatement.getConnection.createArrayOf(“NUMERIC”,v.get.toArray[Any].asInstanceOf[Array[AnyRef]])
尽管我们仍在努力实现它。请注意,大多数驱动程序对数组的支持充其量是参差不齐的(如果数据库本身完全支持它们)。请注意,大多数驱动程序对数组的支持充其量是参差不齐的(如果数据库本身完全支持它们)。