【问题标题】:Slick MappedTo[String] column can't use likeSlick MappedTo[String] 列不能像这样使用
【发布时间】:2014-06-14 00:09:26
【问题描述】:

我想使用 MappedTo[String] 作为一种列类型。有一个查询使用like来选择一些记录。

示例代码:

case class ID(value: String) extends scala.slick.lifted.MappedTo[String]

class Order(tag: Tag) extends Table[(ID, String)](tag, "order") {
  def id = column[ID]("id", O.PrimaryKey)
  def name = column[String]("name", O.NotNull)
  def * = (id, name)
}

val ordres = TableQuery[Order]

def all(implicit session: Session) = {
  ordres.filter(_.id like "2014.%").list
}

编译器错误:

[error]  value like is not a member of scala.slick.lifted.Column[models.ID]
[error]     ordres.filter(_.id like "2014.%").list
[error]                        ^
[error]  ambiguous implicit values:
[error]  both value BooleanColumnCanBeQueryCondition in object CanBeQueryCondition of type => scala.slick.lifted.CanBeQueryCondition[scala.slick.lifted.Column[Boolean]]
[error]  and value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => scala.slick.lifted.CanBeQueryCondition[scala.slick.lifted.Column[Option[Boolean]]]
[error]  match expected type scala.slick.lifted.CanBeQueryCondition[Nothing]
[error]     ordres.filter(_.id like "2014.%").list

如何解决?谢谢。

【问题讨论】:

    标签: slick


    【解决方案1】:

    我目前找到的唯一解决方案是求助于sql interpolated strings

    //slick needs this to be able to convert to your custom wrapper type
    implicit val GetID = GetResult(r => ID(r.nextString))
    
    def all(implicit session: Session) = {
      sql"""select id, name from order where id like '2014.%'""").list
    }
    

    作为旁注,还有一个startsWith 方法可用于过滤带有提升嵌入的字符串,它更适合您的情况;也就是说,如果过滤器按预期工作。

    【讨论】:

      【解决方案2】:

      您应该覆盖值定义。见this answer

      case class ID(id: String) extends scala.slick.lifted.MappedTo[String] {
         override def value: String = id
      }
      

      【讨论】:

      • 我试过这个解决方案,但编译会失败,说:Case class has to have a 'value' field
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2022-08-01
      • 1970-01-01
      相关资源
      最近更新 更多