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