2013-07-09 6 views
16

I gegen einen optionalen Datumsspalte mit Scala Slick 1.0.1 zu filtern bin versucht.Slick und Filterung von Option Spalten

Es kann sein, ich sehe es einfach nicht, aber ich habe eine Tabelle, die etwa wie folgt aussieht:

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

Sie werden es sehen, dass die endDate optional.

Wie konstruiere ich eine Abfrage, wo ich filtere, so kann endDate dem aktuellen (db) Datum NULL/None oder größer als sein? FYI, ich bin mit der Regel, den eingebetteten api

dank

Antwort

11

Das ist nicht schön (der Teil über null.asInstanceOf), aber ich denke, dass es funktionieren wird. Ich habe diese Idee von einer alten Scala Abfrage Post, so dass ich weiß nicht, ob glatt jemals etwas besser gesagt in für das, aber wenn ich auf den resultierenden selectStatement aus der Abfrage sah, sah es richtig:

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

Dank der Kommentar von @MartinKolinek, wird dieser Code auch arbeiten und ist viel sauberer und wahrscheinlich der bessere Weg, Dinge zu tun:

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 würde auch –

+3

arbeiten ich denke, w e sollte IsEmpty zur Slick API hinzufügen, damit wir der Scala Option API entsprechen. – cvogt

+1

@cvogt stimmte, war ich wirklich überrascht, als dass nicht da war ... – cmbaxter