次の 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
}