:_*
この場合、Seq を可変長の引数リストに展開するscala が機能しないのはなぜですか?
そしてそれをエレガントに解決する方法は?
import java.sql.Connection
import scalikejdbc.ConnectionPool
import anorm.{SQL, SqlQuery, SqlRow, Row}
object AnormExample extends App {
Class.forName("org.hsqldb.jdbc.JDBCDriver")
ConnectionPool.singleton("jdbc:hsqldb:mem:hsqldb:WithAnorm", "", "")
implicit val conn: Connection = ConnectionPool.borrow()
// this works
SQL("insert into emp (id, name) values ({id}, {name})").onParams(3, "name3").executeUpdate()
// this does not compile
val row = Seq(4, "name4")
SQL("insert into emp (id, name) values ({id}, {name})").onParams(row:_*).executeUpdate() // david
}
エラー:
scala: type mismatch;
found : Seq[Any]
required: Seq[anorm.ParameterValue[?]]
SQL("insert into emp (id, name) values ({id}, {name})").onParams(row:_*).executeUpdate() // david
PS:
<dependency>
<groupId>play</groupId>
<artifactId>anorm_2.10</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.github.seratch</groupId>
<artifactId>scalikejdbc_2.10</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.2.9</version>
</dependency>
エレガントなソリューションはありますか?
アップデート
セニアからの回答に基づいて、これは問題を解決します:
def toParameterValueSet(seq: Seq[Any]) = seq.map(v => v: anorm.ParameterValue[_])
val row = Seq(5, "name5")
SQL("insert into emp (id, name) values ({id}, {name})").onParams(toParameterValue(row):_*).executeUpdate()
toParameterValueSetを宣言/使用する必要をなくす方法はありますか?
(たとえば、scala に自動展開で暗黙の変換を使用するように指示するには:_*
)
アップデート
もう少しコンパクト:
implicit def toParameterValueSet(seq: Seq[Any]): Seq[anorm.ParameterValue[_]] = seq.map(v => v: anorm.ParameterValue[_])
val row = Seq(5, "name5")
SQL("insert into emp (id, name) values ({id}, {name})").onParams(row:_*).executeUpdate()
@Typesafe チーム: acrom SQL にパラメーターを追加して、一連の値を取得できますか? (代わりに :_* を使用する必要があります) (名前付きパラメーターを使用することが望ましいことに同意しますが、名前のないパラメーターを使用すると便利な場合もあります)