【发布时间】:2015-12-04 00:38:02
【问题描述】:
考虑像这样的存储库/DAO 方法,效果很好:
def countReports(customerId: Long, createdSince: ZonedDateTime) =
DB.withConnection {
implicit c =>
SQL"""SELECT COUNT(*)
FROM report
WHERE customer_id = $customerId
AND created >= $createdSince
""".as(scalar[Int].single)
}
但是如果方法是用可选参数定义的:
def countReports(customerId: Option[Long], createdSince: Option[ZonedDateTime])
要点是,如果存在任何一个可选参数,则在过滤结果时使用它(如上所示),否则(如果是None)只需省略相应的 WHERE 条件。
用可选的 WHERE 条件编写此方法的最简单方法是什么? 作为 Anorm 新手,我一直在努力寻找这方面的示例,但我想一定有一些明智的做法(即,不为存在/缺失参数的每个组合重复 SQL)。
请注意,当在 Anorm SQL 调用中使用时,java.time.ZonedDateTime 实例完美地自动映射到 Postgres timestamptz。 (尝试将 WHERE 条件提取为字符串,在 SQL 之外,使用正常的字符串插值创建无效;toString 产生数据库无法理解的表示。)
播放 2.4.4
【问题讨论】:
-
我在GitHub test repo 玩过不同的选项;随意分叉。
标签: scala playframework playframework-2.4 anorm