Gibt es eine einfache Möglichkeit, einen Stream als Ausgabe eines RowParsers abzurufen?
GegebenrowParser
vom TypRowParser[Photo]
Dies ist, wie Sie eine Liste von Zeilen aus einer Tabelle analysieren würdenphoto
Nach den Code-Beispielen, die ich bisher gesehen habe:
def getPhotos(album: Album): List[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
).as(rowParser *)
}
Bei dem die*
Der Operator erstellt einen Parser vom TypResultSetParser[List[Photo]]
. Nun habe ich mich gefragt, ob es genauso möglich ist, einen Parser zu erhalten, der a ergibtStream
(Ich denke, dass es immer besser ist, fauler zu sein), aber ich habe mir nur Folgendes ausgedacht:
def getPhotos(album: Album): Stream[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
)() collect (rowParser(_) match { case Success(photo) => photo })
}
Es funktioniert, aber es scheint zu kompliziert. Ich könnte natürlich einfach anrufentoStream
auf derList
Ich komme von der ersten Funktion, aber mein Ziel war es, mich nur zu bewerbenrowParser
in Zeilen, die tatsächlich gelesen werden. Gibt es einen einfacheren Weg, dies zu erreichen?
EDIT: Das weiß ichlimit
sollte in der Abfrage verwendet werden, wenn die Anzahl der interessierenden Zeilen im Voraus bekannt ist. Mir ist auch bewusst, dass Sie in vielen Fällen ohnehin das gesamte Ergebnis verwenden werden. Wenn Sie also faul sind, wird die Leistung nicht verbessert. Es kann jedoch vorkommen, dass Sie einige Zyklen speichern, z. Wenn Sie aus irgendeinem Grund Suchkriterien haben, die Sie in SQL nicht ausdrücken können oder möchten. Deshalb fand ich es seltsam, dass Anorm einen Weg bietet, eine zu erhaltenStream
vonSqlRow
Ich habe keinen einfachen Weg gefunden, um eineRowParser
auf diesem.