【发布时间】:2012-10-27 13:46:55
【问题描述】:
给定 RowParser[Photo] 类型的 rowParser,根据我目前看到的代码示例,这就是解析来自表 photo 的行列表的方式:
def getPhotos(album: Album): List[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
).as(rowParser *)
}
* 运算符创建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 })
}
它有效,但似乎过于复杂。我当然可以在从第一个函数获得的List 上调用toStream,但我的目标是仅在实际读取的行上应用rowParser。有没有更简单的方法来实现这一点?
编辑:如果事先知道感兴趣的行数,我知道应该在查询中使用limit。我也知道,在很多情况下,无论如何你都会使用整个结果,所以懒惰不会提高性能。但在某些情况下,您可能会节省几个周期,例如如果由于某种原因,您有无法或不想在 SQL 中表达的搜索条件。所以我觉得奇怪的是,鉴于 anorm 提供了一种获取SqlRow 的Stream 的方法,我没有找到一种直接的方法来应用RowParser。
【问题讨论】:
标签: scala playframework-2.0 anorm