使用 slick 比较 java.sql.Timestamp 和 LocalDate?

Comparing java.sql.Timestamp and LocalDate using slick?

我有一个漂亮的列,它是 Rep[Option[Timestamp]]。我想将它与通过过滤器方法提供的 java.util.LocalDate 的用户进行比较。我只对比较日期 (ddMMyyyy) 感兴趣,而不是时间:

val userSuppliedLocalDate: LocalDate = ...
usersTable.filter(_.modifiedDate === userSuppliedLocalDate).result // Doesn't compile

我考虑过将 Rep[Timestamp] (_.modifiedDate) 转换为 LocalDate,但不确定这是否可行(展开 Rep 类型?)

或者,将 userSuppliedLocalDate 转换为 java.sql.Timestamp 并进行忽略时间部分的比较 - 这可能吗?

不推荐的方式

 Warning: Take care of time zone information

您可以将LocalDate转换成时间戳并比较时间戳。

val timestamp = Timestamp.valueOf(localDate.atStartOfDay)

你的方法变成了

val userSuppliedLocalDate: LocalDate = ...
val userSuppliedTimestamp = Timestamp.valueOf(localDate.atStartOfDay)
usersTable.filter(_.modifiedDate === userSuppliedTimestamp).result

但是,这不是推荐的方式。

如果你想比较特定日期的时间戳。一个 Hack 是

val start = Timestamp.valueOf(localDate.atStartOfDay())
val end = Timestamp.valueOf(start.plusDays(1))

usersTable.filter(row => row.modifiedDate >= start && row.modifiedDate < end).result

推荐的方法是使用 LocalDate 本身作为光滑的 table 列。

这怎么可能?

This possible with slick column mapper.

以下隐含在范围内。

implicit val mapper = MappedColumnType.base[LocalDate, Timestamp](
 _.toLocalDateTime().toLocalDate(),
 Timestamp.valueOf)

现在您可以直接拥有 LocalDate

def birthday = column[LocalDate]("birthday")

现在可以直接比较了

def birthdaysBefore(localDate: LocalDate) = 
  query.filter(_.birthday < localDate).result

您也可以使用其他比较运算符。