slick3 で sql in を書く
最近仕事でSlick3を使ってますが、 SELECT * FROM hoge WHERE hoge.id IN (1, 2, 3)
的な書き方が最初わからなかったのでメモ。
生SQLパターン
生SQLではどうやらListを扱ってないらしい。 というのを、 id:tarao さんのこの記事で知りました。
へぇ、そうだったのか。
taraoさんには、Scala関西Summitで発表していただいたし、 bullet-scala
面白そうなので、今のプレジェクトに突っ込むかもしれないと思いつつ、勉強させて頂いてますが、 IN
のことは知りませんでした。
liftedな書き方パターン
Scalaらしいモナモナした(?)書き方でやるとき。 今のプロジェクトではこっちでやってます。
こういうやつ↓
db.run {
hoges.filter(id = 1).result
}
これで、SQLの IN
を使うには、2通りあるらしい。
一つは、SQLのサブクエリを評価するとき。これには in
を使う
db.run { hoges.filter(id.in(fugas.map(_.hogeId))).result }
もうひとつ、 Scalaのコレクションを利用するとき。これには、 inSet
という関数が用意されてる。
val hogeIds = List(1,2,3) db.run { hoges.filter(id.inSet(hogeIds)).result }
これ、公式ドキュメントに普通に載ってるんですが、Querysのページばっかり読んでて、見つけるまで時間がかかってしまいました。