【问题标题】:Slick and filtering by Option columns按选项列平滑和过滤
【发布时间】:2013-07-07 10:02:38
【问题描述】:

我正在尝试使用 Scala Slick 1.0.1 过滤可选的日期列。

可能我只是没有看到它,但我有一张看起来像这样的表格:

case class UserRole(id:UUID, userID:UUID, role:String)
object UserRole extends Table[UserRole]("User_Role")  {

  //(id: Long = 0l, name: String, active: Boolean) extends KeyedEntity[Long] {
  def id = column[UUID]("ID", O.PrimaryKey)
  def userID = column[UUID]("user_id")
  def vendorID = column[UUID]("vendor_id")
  def role = column[String]("role")
  def user = foreignKey("user_FK", userID, User)(_.id)

  def start = column[java.sql.Date]("startDate")
  def endDate = column[Option[java.sql.Date]]("endDate")

  def * = id ~ userID ~ role  <> (UserRole.apply _, UserRole.unapply _)
}

您会看到 endDate 是可选的。

如何构造一个查询,以便过滤以便 endDate 可以为 NULL/None 或大于当前 (db) 日期?仅供参考,我通常使用嵌入式 api

谢谢

【问题讨论】:

    标签: scala slick scalaquery


    【解决方案1】:

    这不是很漂亮(关于null.asInstanceOf 的部分),但我认为它会起作用。我从一个旧的 Scala Query 帖子中得到了这个想法,所以我不知道 slick 是否曾经为此添加了更好的东西,但是当我查看来自查询的结果 selectStatement 时,它看起来是正确的:

    val now = new java.sql.Date(System.currentTimeMillis())
    val query = for {
      role <- UserRole
      if (role.endDate === null.asInstanceOf[Option[java.sql.Date]] || role.endDate > now)
    } yield role
    

    编辑

    感谢@MartinKolinek 的评论,这段代码也可以工作,而且更干净,可能是更好的做事方式:

    val now = new java.sql.Date(System.currentTimeMillis())
    val query = for {
      role <- UserRole
      if (role.endDate.isNull || role.endDate > now)
    } yield role
    

    【讨论】:

    • 我认为我们应该将 isEmpty 添加到 Slick API,以便我们符合 Scala Option API。
    • 检查 Option[A] 列是否等于某个 A 的 Slick 3.0 方法是什么?
    • @KevinMeredith,我还没有使用 slick 3.0,但快速查看 OptionColumnExtensionMethods api 文档 (slick.typesafe.com/doc/3.0.2/api/…) 会发现诸如 ===&gt;= 等内容。 . 这似乎是用于比较查询的运算符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多