Play Slick:与Option [String]列一样

时间:2017-07-19 17:26:59

标签: scala playframework slick

如果对象为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]列?

修改

我尝试过一些东西,比如:

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

    中抛出异常

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

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

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

  3. 类型不匹配

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

  4. 修改2

    现在这已修复,https://github.com/slick/slick/issues/1664

    中有更多信息

1 个答案:

答案 0 :(得分:1)

您可以使用asColumnOf来实现此目标:

order.membershipCode.asColumnOf[String].toLowerCase like searchTerm

根据您的数据库,这将生成一个包含WHERE子句的查询,如下所示:

where lcase(cast("membershipCode" as VARCHAR)) like ...etc

Slick issue 1664是一张寻找此解决方案的票据。