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] 列?

编辑

我尝试了一些方法,例如:

  1. 编译正常,但在执行时会在get

    中抛出异常

    一些(order.membershipCode.get.toLowerCase.like(searchTerm))

  2. reduceLeftOption(_ || _) 不再有效

    一些(order.membershipCode.toLowerCase.like(searchTerm))

  3. 类型不匹配

    一些(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 是一个寻找通用解决方案的工单。