Na przykład, mam następujące definicje tabeli:Jak mogę wykonywać zapytania zbiorcze w środowisku Slick?
object Houses extends Table[Long]("Houses") {
def id = column[Long]("id")
def * = id
}
object Rooms extends Table[(Long, Long)]("Rooms") {
def id = column[Long]("id")
def houseId = column[Long]("houseId")
def size = column[Int]("size")
def * = id ~ houseId ~ size
}
I chcę, aby wybrać największy pokój dla każdego domu.
wymyśliłem następującą sztuczkę:
val query = {
(r1, r2) <- Rooms leftJoin Rooms on ((r1,r2) =>
r1.houseId === r2.houseId && r1.size > r2.size
)
if r2.id.isNull
} yield r1
Robi to co muszę, ale jest brzydki, całkowicie nieczytelny, i wydaje się zranić wydajności. Próbowałem użyć groupBy
w zapytaniu, ale wydaje mi się, że nie rozumiem jakiejś podstawowej koncepcji - nie mogę uzyskać prawidłowych typów.
Czy istnieje lepszy sposób na wykonanie takiego zapytania zbiorczego w aplikacji Slick?
Dzięki! Wersja z 'exist' jest rzeczywiście znacznie szybsza i przechodzi przez 30x mniej wierszy. – Rogach