【问题标题】:Scala Slick Bulk Insert with Array带有数组的 Scala Slick Bulk 插入
【发布时间】:2014-02-01 06:15:00
【问题描述】:

我将一个长字符串拆分为一个字符串数组,然后我想将它们全部插入数据库。我可以轻松地循环遍历数组并一一插入,但似乎效率很低。然后我认为有一个insertAll() 方法。但是,insertAll() 方法是这样定义的:

def insertAll(values: U*)

这仅接受多个 U,但不接受 ArrayList

/* Insert a new Tag  */
def insert(insertTags: Array[String])(implicit s: Session) {
  var insertSeq: List[Tag] = List()
  for(tag <- insertTags) {
    insertSeq ++= new Tag(None, tag)
  }
  Tag.insertAll(insertSeq)

}

*Tag是表对象

这是我编写的初步代码。它不起作用,因为insertAll() 不接受Seq。我希望有办法做到这一点......所以它不会生成数组长度乘以 SQL 插入子句。

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    当一个函数需要重复的参数如 U* 而你想传递一个 U 的序列时,它必须被标记为一个序列参数,这是用: _* 完成的,如

    Tag.insertAll(insertSeq: _*)
    

    这在 6.6 节的规范中有所描述。它消除了某些情况的歧义,例如;

    def f(x: Any*)
    f(Seq(1, "a"))
    

    在那里,f 可以用一个参数Seq(1, "a") 或两个1"a" 调用。它将是前者,后者是用 f(Seq(1, "a"): _*) 完成的。 Python 有类似的语法。


    关于您评论中的问题: 它适用于 Seq、符合 Seq 的集合以及可以隐式转换为 Seq(包括数组)的值。这意味着很多集合,但不是全部。例如,不允许使用 Set(但它们具有 toSeq 方法,因此使用 Set 调用仍然很容易)。

    它不是一个方法,它更像是一个类型描述。它只是告诉编译器这个参数本身就是完整的预期 Seq,而不是序列参数中的唯一项。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多