【发布时间】:2018-02-18 14:04:45
【问题描述】:
我需要根据一些标准构建动态过滤器,其中涉及 可选列:
标准
case class Criteria(
name: Option[String] = None,
description: Option[String] = None,
)
表映射
class OrganizationsTable(tag: Tag) extends Table[OrganizationModel](tag, "organizations") {
def id = column[Long]("id", O.PrimaryKey)
def name = column[String]("name")
def description: Rep[Option[String]] = column[Option[String]]("description")
def * = (id, name, description) <> ((OrganizationModel.apply _).tupled, OrganizationModel.unapply)
}
过滤器
organizations.filter { model =>
List(
criteria.name.map(model.name.like(_)),
criteria.description.map(v => model.description.isDefined && model.description.like(v))
)
.collect({case Some(cr) => cr})
// value && is not a member of slick.lifted.Rep[_1]
.reduceLeftOption(_ && _).getOrElse(true: Rep[Boolean])
}
但我收到编译错误:
值 && 不是 slick.lifted.Rep[1] [错误]
的成员 .reduceLeftOption( && _).getOrElse(true: Rep[Boolean])
如果我像这样将get 添加到model.description:
criteria.description.map(v => model.description.isDefined && model.description.get.like(v))
编译正常,但抛出运行时异常:
slick.SlickException:在计算默认值时捕获异常 for Rep[Option[_]].getOrElse -- 当 数据库端需要值
如何在 slick 中构建涉及可选列的动态查询?
【问题讨论】: