2013-07-09 17 views
16

Tôi đang cố gắng lọc một cột ngày tùy chọn bằng Scala Slick 1.0.1.Trượt và lọc theo các cột Tùy chọn

Nó có thể là tôi chỉ không nhìn thấy nó, nhưng tôi đã có một bảng trông giống như sau:

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

Bạn sẽ thấy có rằng ENDDATE là không bắt buộc.

Làm cách nào để tạo truy vấn mà tôi lọc để endDate có thể là NULL/None hoặc lớn hơn ngày hiện tại (db)? FYI, tôi thường sử dụng api nhúng

nhờ

Trả lời

11

Đây không phải là khá (phần về null.asInstanceOf), nhưng tôi nghĩ rằng nó sẽ làm việc. Tôi đã nhận rằng ý tưởng từ một bài Scala Query cũ, vì vậy tôi không biết nếu trơn bao giờ đặt một cái gì đó tốt hơn trong cho điều đó, nhưng khi tôi nhìn vào kết quả selectStatement từ truy vấn, nó trông đúng:

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

Nhờ những nhận xét của @MartinKolinek, mã này cũng sẽ làm việc và có nhiều bụi và có lẽ là cách tốt hơn để làm những việc:

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 sẽ cũng làm việc –

+3

tôi nghĩ w e nên thêm isEmpty vào API Slick để chúng tôi tuân theo API tùy chọn Scala. – cvogt

+1

@cvogt, đã đồng ý, tôi thực sự ngạc nhiên khi điều đó không có ở đó ... – cmbaxter