2013-07-09 4 views
16

Scala Slick 1.0.1을 사용하여 선택적 날짜 열을 기준으로 필터링하려고합니다.Slick 및 옵션 열 필터링

는 내가 단지 그것을 볼 수 없습니다 수 있지만, 내가 이렇게 보이는 테이블을 가지고 :

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를이 (null.asInstanceOf에 대한 부분) 꽤되지 않습니다

감사

답변

11

을 사용하고 있습니다,하지만 난 그것을 작동합니다 생각합니다. 나는 오래된 스칼라 쿼리 포스트에서 그 아이디어를 가지고, 그래서 매끄러운 이제까지 그것을 위해 더 나은 뭔가를 넣어 나도 몰라,하지만 난 쿼리의 결과 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 
+5

role.isNull도 내가 w 생각 –

+3

작동 할을 스칼라 API에 isEmpty를 추가하여 스칼라 옵션 API를 준수해야합니다. – cvogt

+1

@cvogt, 동의, 나는 거기에 없었을 때 실제로 놀랐다. – cmbaxter