これまで見てきたコード サンプルによるとrowParser、 typeが与えられた場合RowParser[Photo]、 table からの行のリストを解析する方法は次のとおりです。photo
def getPhotos(album: Album): List[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
).as(rowParser *)
}
*オペレーターが type のパーサーを作成する場所ResultSetParser[List[Photo]]。さて、私は (より怠惰な方が常に良いと考えて) を生成するパーサーを取得することも同様に可能かどうか疑問に思っていましたが、Stream私はこれしか思いつきませんでした:
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 })
}
動作しますが、複雑すぎるようです。toStreamもちろん、最初の関数から取得したを呼び出すこともできますが、実際に読み取られる行Listにのみ適用することが目標でした。rowParserこれを達成する簡単な方法はありますか?
編集:limit対象の行数が事前にわかっている場合、クエリで使用する必要があることはわかっています。また、多くの場合、とにかく結果全体を使用することになるため、怠けてもパフォーマンスは向上しないことも認識しています。ただし、いくつかのサイクルを節約できる場合もあります。たとえば、何らかの理由で、SQL で表現できない、または表現したくない検索基準がある場合などです。Streamしたがって、 anorm がofを取得する方法を提供するという事実を考えると、それに aSqlRowを適用する簡単な方法を見つけられなかったのは奇妙だと思いRowParserました。