【发布时间】:2013-01-19 23:36:35
【问题描述】:
也许是个愚蠢的问题。但到目前为止我还没有找到答案。那么如何在SLICK中表示SQL的“LIKE”运算符呢?
【问题讨论】:
标签: scala scalaquery slick
也许是个愚蠢的问题。但到目前为止我还没有找到答案。那么如何在SLICK中表示SQL的“LIKE”运算符呢?
【问题讨论】:
标签: scala scalaquery slick
一如往常!
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%';
【讨论】:
coffee 和 name 之间的点)。
这就是我让它工作的方式:
// 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)
然后您可以使用您的数据库运行它:
val res = db.run(query.result)
当然res在这里是一个future,你需要使用await来得到实际结果。
【讨论】:
假设您有一个名为 logs 的表,其中包含 3 个字段 -
您要执行 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
)
【讨论】: