4

:_*この場合、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 にパラメーターを追加して、一連の値を取得できますか? (代わりに :_* を使用する必要があります) (名前付きパラメーターを使用することが望ましいことに同意しますが、名前のないパラメーターを使用すると便利な場合もあります)

4

2 に答える 2

3

あなたは交換しようとすることができます

val row = Seq(4, "name4")

val row = Seq[anorm.ParameterValue[_]](4, "name4")

すべての型に暗黙的な変換があるため、次を使用してコレクションを変換できますrow.map{ e => e: anorm.ParameterValue[_] }

于 2013-04-09T14:20:42.463 に答える