16

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) 日付より大きくなるようにフィルタリングするクエリを作成するにはどうすればよいですか? 参考までに、私は一般的に埋め込みAPIを使用しています

ありがとう

4

1 に答える 1

11

これはきれいではありませんが ( に関する部分null.asInstanceOf)、うまくいくと思います。古い Scala Query の投稿からそのアイデアを得たので、slick がそれをより適切に取り入れたかどうかはわかりませんが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
于 2013-07-09T17:37:35.167 に答える