2015-12-23 29 views
1

我試圖將一個List [String]插入到text []類型的postgresql列中。我相信當你嘗試插入任何列表時,Anorm將列表的每個成員插入到它自己的列中。我很確定這是事實,因爲我找回例外:玩Anorm插入scala列表到postgres文本數組列

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

我想要做的是將整個列表插入爲文本[]。我當前的代碼:

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 

回答

1

爲參數ANORM傳遞的價值觀是不應該成爲原始的JDBC值。你不應該通過java.sql.*值;你可以看看parameter mappings

然後,您傳遞的參數名稱爲Symbol,它已在Anorm 2.3中棄用,並且自2.4起不再支持。名字必須爲String

SQL數組可以作爲Array[T]傳遞,其中支持T作爲參數類型。

您還可以查看關於multi-value parameters的文檔。

+0

所以我使用.toArray解決了轉換列表,但現在我得到「org.postgresql.util.PSQLException:找不到提供的名稱VARCHAR的服務器數組類型」。它插入的列是文本[]。 – plambre

+0

當應該傳遞「varchar」時,是否通過某些類型轉換「VARCHAR」? – plambre

+0

在這裏你可以看到使用「VARCHAR」作爲「sqlType」和jdbcType的模式https://github.com/playframework/anorm/blob/ce5e676ff0317eb3005156bd5717c768b9f8dc40/core/src/main/scala/anorm/ParameterMetaData.scala – plambre

0

,結束了對這一問題的工作代碼爲:

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例外非常神祕。