播放Anorm将scala列表插入postgres文本数组列

时间:2015-12-23 21:56:12

标签: scala playframework-2.4 anorm

我正在尝试将List [String]插入text []类型的postgresql列中。我相信当您尝试插入任何List时,Anorm会将List的每个成员插入其自己的列中。我很确定这是因为我回到了例外:

org.postgresql.util.PSQLException: ERROR: INSERT has more expressions than target columns

我想要做的是将整个List作为文本[]插入。我目前的代码:

def insertList(listName: String, subLists: List[String]): Long = {
DB.withConnection{implicit c =>
SQL(
  """
    INSERT INTO mailinglists(name, sublists) VALUES({listName}, {subLists})
  """)
  .on('listName -> listName, 'subLists -> subLists)
  .executeInsert(scalar[Long] single)
}
}

我试着走这条路:

ConnectionPool.borrow().createArrayOf("text", subLists.toArray)

但我收到错误:

type mismatch;
found   : (Symbol, java.sql.Array)
required: anorm.NamedParameter

2 个答案:

答案 0 :(得分:1)

作为参数传递给Anorm的值不应该是原始JDBC值。你不应该传递java.sql.*值;您可以查看parameter mappings

然后,您将参数名称传递为Symbol,这已在Anorm 2.3中弃用,并且自2.4以来不再受支持。名称必须以String传递。

SQL数组可以Array[T]传递,支持T作为参数类型。

您还可以查看有关multi-value parameters

的文档

答案 1 :(得分:1)

最终解决此问题的代码是:

def insertList(listName: String, subLists: List[String]): Long = {
DB.withConnection{implicit c =>
  SQL"INSERT INTO mailinglists(name, sublists) VALUES($listName, ARRAY[$subLists])"
  .executeInsert(scalar[Long] single)
}
}

从原帖中改变的是使用Anorm字符串插值SQL" ..."以及在多值参数周围添加ARRAY[...]。我不完全确定为什么这有效,因为postgres例外是非常神秘的。