これまで見てきたコード サンプルによると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
ました。