我想将SQL查询转换为TableQuery:
TableQuery
SELECT ..., TRIM(LEADING '0' FROM mycolumn) FROM mytable WHERE TRIM(LEADING'0' FROM mycolumn) = '$key
应该成为 MyTableQuery.filter(<_.mycolumn something something> )
MyTableQuery.filter(<_.mycolumn something something> )
我无法使用,implicitMappedColumnType因为我正在映射至String,String并且String结果中还有其他列。我不知道我会怎么使用它都SELECT和WHERE
implicitMappedColumnType
String
SELECT
WHERE
对于SELECT零件,我创建了一个自定义函数,用于将结果元组映射到我的case类,因此我只需要一个WHERE零件解决方案。
已经从文档中阅读了来自SQL的介绍和用户定义的功能,但是不幸的是,我没有一个明智的选择。我想我可以用一个,SimpleFunction.unary[String,String]但还没有弄清楚怎么做。
SimpleFunction.unary[String,String]
我会修剪经常String用dropLeft,但是Rep[String]没有这样的方法。ltrim不接受参数。endsWith就我而言是模棱两可的。
dropLeft
Rep[String]
ltrim
endsWith
我无法填充查询String,因为并非数据库中的所有值都被填充并且具有不同的长度。
我绝对可以使用简单的SQL并映射结果,但是我真的很想了解我在这里缺少的内容。
我正在使用Slick 3.1.1
TRIM(LEADING)的语法有点奇怪,这意味着您必须使用SimpleExpression并使用QueryBuilder来访问。
val trimLeading = SimpleExpression.binary[String, String, String] { (trimChar, str, queryBuilder) => import slick.util.MacroSupport._ import queryBuilder._ b"TRIM(LEADING $trimChar FROM $str)" }
这是一个练习它的例子
import com.typesafe.config.ConfigFactory import slick.backend.DatabaseConfig import slick.driver.JdbcProfile import scala.concurrent.duration.Duration import scala.concurrent.Await object TrimLeading extends App { def trimLeadingExample(dbConfig: DatabaseConfig[JdbcProfile]): Unit = { import dbConfig.driver.api._ val trimLeading = SimpleExpression.binary[String, String, String] { (trimChar, str, queryBuilder) => import slick.util.MacroSupport._ import queryBuilder._ b"TRIM(LEADING $trimChar FROM $str)" } class ZeroTable(tag: Tag) extends Table[String](tag, "ZeroTable") { def zeros = column[String]("zeros") def * = zeros } val zeroTable = TableQuery[ZeroTable] exec(zeroTable.schema.create) exec(zeroTable ++= Seq("000000x", "00x", "000000000x", "00000x", "00xx")) exec(zeroTable. filter(s => trimLeading("0", s.zeros) === "x"). map(s => trimLeading("0", s.zeros)).result).foreach(println) exec(zeroTable.schema.drop) def exec[T](action: DBIO[T]): T = Await.result(dbConfig.db.run(action), Duration.Inf) } val configStr = """ | driver = "freeslick.OracleProfile$" | db { | driver = oracle.jdbc.OracleDriver | url="jdbc:oracle:thin:@//localhost:49161/xe" | properties = { | databaseName = "freeslicktest" | user = "system" | password = "oracle" | } | } """.stripMargin trimLeadingExample(DatabaseConfig.forConfig[JdbcProfile]("", ConfigFactory.parseString(configStr))) }
从日志中,该语句是
*** (s.jdbc.JdbcBackend.statement) Preparing statement: select TRIM(LEADING'0' FROM "zeros") from "ZeroTable" where TRIM(LEADING '0' FROM "zeros") = 'x'