2013-07-09 10 views
16

Próbuję filtrować względem opcjonalnej kolumny daty za pomocą Scala Slick 1.0.1.Zręczne i filtrowanie według kolumn opcji

Może to być po prostu nie widzę, ale mam tabelę, która wygląda mniej więcej tak:

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 _) 
} 

Zobaczysz tam, że endDate jest opcjonalne.

Jak skonstruować zapytanie, które filtruję, aby wartość endDate mogła mieć wartość NULL/None lub większą niż data bieżąca (db)? FYI, jestem ogólnie za pomocą wbudowanego API

dzięki

Odpowiedz

11

To nie jest ładna (część o null.asInstanceOf), ale myślę, że to będzie działać. Mam ten pomysł ze starego postu Query Scala, więc nie wiem, czy zręczny kiedykolwiek umieścić w coś lepszego na to, ale kiedy spojrzałem na otrzymanej selectStatement z zapytaniem, wyglądało to poprawne:

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 

EDIT

Dzięki komentarzem @MartinKolinek, kod ten będzie również pracować i jest znacznie czystsze i chyba lepszego sposobu, aby robić rzeczy:

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

role.isNull będzie również pracować –

+3

myślę w Powinniśmy dodać isEmpty do Slick API, abyśmy byli zgodni z interfejsem API Scala Option. – cvogt

+1

@ cvogt, zgodziłem się, byłem naprawdę zaskoczony, kiedy tego nie było ... – cmbaxter

Powiązane problemy