Слайк и фильтрация по столбцам Option

Я пытаюсь выполнить фильтрацию с необязательным столбцом даты с помощью 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) даты? FYI, я обычно использую встроенный api

спасибо

Ответы

Ответ 1

Это не очень (часть null.asInstanceOf), но я думаю, что это сработает. Я получил эту идею из старого сообщения Scala Query, поэтому я не знаю, использовал ли пятно что-то лучше для этого, но когда я посмотрел на результат 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