Слайк и фильтрация по столбцам 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