Per esempio, ho le seguenti definizioni di tabella:Come posso eseguire query aggregate in 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
}
e voglio selezionare il più grande spazio per ogni casa.
mi si avvicinò con il seguente trucco:
val query = {
(r1, r2) <- Rooms leftJoin Rooms on ((r1,r2) =>
r1.houseId === r2.houseId && r1.size > r2.size
)
if r2.id.isNull
} yield r1
Si fa quello che mi serve, ma è brutto, totalmente illeggibile, e sembra compromettere le prestazioni. Ho provato a usare groupBy
su query, ma sembra che io stia fraintendendo un concetto fondamentale - non riesco a capire bene i tipi.
Esiste un modo migliore per eseguire tale query aggregata in Slick?
Grazie! La versione con 'exists' è infatti molto più veloce e percorre 30x in meno di righe. – Rogach