10

持ち上げられた埋め込みを使用する場合、 Slickのクエリ内の値をどのように「持ち上げる」のですか? 「get」、「toLong」などでうまくいくことを期待していましたが、そのような運はありませんでした。

次のコードはコンパイルされません。

  val userById = for {
     uid <- Parameters[Long]
     u <- Users if u.id === uid
  } yield u

  val userFirstNameById = for {
     uid <- Parameters[Long]
     u <- userById(uid)
     ---------------^
     // type mismatch;  found   : scala.slick.lifted.Column[Long]  required: Long
  } yield u.name
4

1 に答える 1

4

次の 2 つの理由から、できません。

1)valこれはコンパイル時に発生しているため、Long 値はありませんuid。をコンパイル時に生成された準備済みステートメントにuserById(uid)バインドし、、 などがクエリを呼び出します。Long uid.list.first

2) もう 1 つの問題はParameter、クエリを ize するとすぐに、構成ができなくなることです。これは ScalaQuery にまでさかのぼる制限です。

あなたの最善の策はParameter、最終的に作成されたクエリまで化を遅らせることです:

val forFooBars = for{
  f <- Foos
  b <- Bars if f.id is b.fooID
} yield(f,b)
val allByStatus = for{ id ~ active <- Parameters[(Long,Boolean)]
  (f,b) <- forFooBars if (f.id is id) && (b.active is active)
} yield(f,b)

def findAllByActive(id: Long, isActive: Boolean) = allByStatus(id, isActive).list

とにかく、あなたの例では、次のこともできます:

val byID = Users.createFinderBy(_.id)

この種のことを機能させるために私が知っている唯一の方法は、クエリvalを でラップdefしてランタイム変数を渡すことです。つまり、Slick はリクエストごとに sql を再生成する必要があり、準備されたステートメントは基になる DBMS に送信されません。 . List(1,2,3)forを渡すなど、場合によってはこれを行う必要がありますinList

def whenNothingElseWorks(id: Long) = {
  val userFirstNameById = for {u <- userById(id.bind)} yield u.name
}
于 2013-01-31T14:03:50.050 に答える