如果对象为like
,如何使用column[Option[String]]
进行查询?
这是我的模特:
val id: Rep[Int] = column[Int]("id", O.AutoInc, O.PrimaryKey)
val ownerName: Rep[String] = column[String]("owner_name")
val membershipCode: Rep[Option[String]] = column[Option[String]]("membership_code")
这是我的疑问:
val query = orderTableQuery.filter { order =>
Seq(
search.filter(!_.isEmpty).map(filterString => {
val searchTerm = s"%$filterString%".toLowerCase
Seq(
// Some(order.membershipCode.toLowerCase like searchTerm), // This is the one causing problems
Some(order.ownerName.toLowerCase like searchTerm) // This works fine
).flatten.reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
}),
// ...other optional filters
).flatten.reduceLeftOption(_ && _).getOrElse(true: Rep[Boolean])
}
但是,当我尝试从该行中删除注释标记时,序列的类型会发生变化,因此如果我在选项列中添加reduceLeftOption(_ || _)
,则无法生成get
部分然后它编译正常,但当我尝试查询光滑抛出一个错误,因为你不能在数据库中使用get(这对我来说很有意义),但是,那么,我该如何处理这个Option[String]
列?
修改
我尝试过一些东西,比如:
编译正常,但执行时会在get
中抛出异常一些(order.membershipCode.get.toLowerCase.like(SEARCHTERM))
reduceLeftOption(_ || _)
不再有效
一些(order.membershipCode.toLowerCase.like(SEARCHTERM))
类型不匹配
一些(order.membershipCode.toLowerCase.like(一些(SEARCHTERM)))
修改2
中有更多信息答案 0 :(得分:1)
您可以使用asColumnOf
来实现此目标:
order.membershipCode.asColumnOf[String].toLowerCase like searchTerm
根据您的数据库,这将生成一个包含WHERE
子句的查询,如下所示:
where lcase(cast("membershipCode" as VARCHAR)) like ...etc
Slick issue 1664是一张寻找此解决方案的票据。