如何在SLICK中使用SQL的“LIKE”运算符

33

也许这是一个愚蠢的问题。但是到目前为止我没有找到答案。那么在SLICK中如何表示SQL的 "LIKE" 运算符呢?

3个回答

49

就像你平常一样!

val query = for {
  coffee <- Coffees if coffee.name like "%expresso%"
} yield (coffee.name, coffee.price)

将生成类似于 SQL 的语句

SELECT name, price FROM coffees WHERE NAME like '%expresso%';

1
谢谢。是Scala查询还是Slick?对我来说,在Slick中只有使用coffe.name.like("%expresso%")(使用点分隔符)才有效。 - wassertim
@Tim:你的语法和Faiz展示的是等价的(请注意coffeename之间的点)。 - kiritsuku
4
有人知道这个“like”是否对字符串进行了卫生处理吗? - Travis Stevens
请注意:此解决方案允许 SQL 注入! - Dileep
3
如果 coffee.name 像 "%${queryStringFromUser}%" 这样,它似乎对字符串进行了净化处理。如果它包含 \ 或 ',它将被转义。 - Tim Gautier
显示剩余3条评论

3
这是我让它正常运作的方法:
// argMap is map of type [Str, Str]
val query = for {
    coffee <- coffees if (
      argMap.map{ case (k,v) =>
        metric.column[String](k) like s"%${v}%"
      }.reduce(_ && _)
    )
  } yield(coffee.name)

然后您可以使用您的db运行以下代码:

val res = db.run(query.result)

当然,这里的res是一个future,您需要使用await获取实际结果。


0
假设您有一个名为logs的表,其中包含3个字段 -
  1. id
  2. message
  3. datetime

您想执行LIKE操作。因此它将是:

 def data(data: ReqData): Future[Seq[Syslog]] =  {
      sysLogTable
        .filter(_.datetime >= data.datetimeFrom)
        .filter(_.datetime <= data.datetimeUntil)
        .filter(_.message like s"%${data.phrase}%")
        .result
 }

注意:针对sysLogTable

val sysLogTable: TableQuery[SyslogsTable] = TableQuery[SyslogsTable]

class SyslogsTable(tag: Tag) extends Table[Syslog](tag, "logs") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

  def message = column[String]("message")

  def datetime = column[Timestamp]("date")

  def * = (id.?, message, datetime) <> ((Syslog.apply _).tupled, Syslog.unapply)
}

注意:对于Syslog案例类。
case class Syslog(
   id: Option[Long],
   message: String,
   datetime: Timestamp
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接