Play Slick:喜欢 Option[String] 列
Play Slick: Like with an Option[String] column
当对象是 column[Option[String]]
时,如何使用 like
进行查询?
这是我的模型:
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])
}
但是,当我尝试从该行中删除注释标签时,序列的类型发生了变化,因此如果我在option 列然后它编译得很好,但是当我尝试查询时,slick 会抛出一个错误,因为你不能在数据库中使用 get(这对我来说是有道理的),但是,我该如何处理这个 Option[String]
列?
编辑
我尝试了一些方法,例如:
编译正常,但在执行时会在get
中抛出异常
一些(order.membershipCode.get.toLowerCase.like(searchTerm))
reduceLeftOption(_ || _)
不再有效
一些(order.membershipCode.toLowerCase.like(searchTerm))
类型不匹配
一些(order.membershipCode.toLowerCase.like(一些(searchTerm)))
编辑 2
现已修复,更多信息请见 https://github.com/slick/slick/issues/1664
您可以使用 asColumnOf
来实现:
order.membershipCode.asColumnOf[String].toLowerCase like searchTerm
根据您的数据库,这将生成一个包含 WHERE
子句的查询,如下所示:
where lcase(cast("membershipCode" as VARCHAR)) like ...etc
Slick issue 1664 是一个寻找通用解决方案的工单。
当对象是 column[Option[String]]
时,如何使用 like
进行查询?
这是我的模型:
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])
}
但是,当我尝试从该行中删除注释标签时,序列的类型发生了变化,因此如果我在option 列然后它编译得很好,但是当我尝试查询时,slick 会抛出一个错误,因为你不能在数据库中使用 get(这对我来说是有道理的),但是,我该如何处理这个 Option[String]
列?
编辑
我尝试了一些方法,例如:
编译正常,但在执行时会在get
中抛出异常一些(order.membershipCode.get.toLowerCase.like(searchTerm))
reduceLeftOption(_ || _)
不再有效一些(order.membershipCode.toLowerCase.like(searchTerm))
类型不匹配
一些(order.membershipCode.toLowerCase.like(一些(searchTerm)))
编辑 2
现已修复,更多信息请见 https://github.com/slick/slick/issues/1664
您可以使用 asColumnOf
来实现:
order.membershipCode.asColumnOf[String].toLowerCase like searchTerm
根据您的数据库,这将生成一个包含 WHERE
子句的查询,如下所示:
where lcase(cast("membershipCode" as VARCHAR)) like ...etc
Slick issue 1664 是一个寻找通用解决方案的工单。