我使用的是Scala 2.10.2和Slick 2.1.0。
我有一张看起来有点像这样的表:
class MyTable( val tag : Tag ) extends Table[Int,Int,String]( tag, "coordinates" )
{
def x = column[Int]( "x" )
def y = column[Int]( "y" )
def data = column[String]( "data" )
def * = ( x, y, data )
}
现在,我已经创建了一个案例类:
case class Coordinate( val x : Int, val y : Int )
我想将我的表格定义更改为以下内容:
class MyTable( val tag : Tag ) extends Table[Coordinate,String]( tag, "coordinates" )
{
def x = column[Int]( "x" )
def y = column[Int]( "y" )
def data = column[String]( "data" )
def * = ( Coordinate( x, y ), data )
}
但是,这不起作用,因为x
定义中的*
是Column[Int]
而不是Int
。我知道你可以在你的表的所有列和一个案例类之间提供转换,有没有办法只转换一些列,因为我喜欢这里?
感谢。
答案 0 :(得分:2)
你可以试试这个:
import play.api.db.slick.Config.driver.simple._
import scala.slick.lifted.Tag
case class Coordinate(val x: Int, val y: Int)
class MyTable(val tag: Tag) extends Table[(Coordinate, String)](tag, "coordinates") {
def x = column[Int]("x")
def y = column[Int]("y")
def data = column[String]("data")
def * = (x, y, data).shaped <> ({
case (x, y, data) => (Coordinate(x, y), data)
}, { ct: Tuple2[Coordinate, String] =>
Some(ct._1.x, ct._1.y, ct._2)
})
}
object Coordinates {
val mytable = TableQuery[MyTable]
def insert(ct: (Coordinate, String))(implicit session: Session) = {
mytable.insert(ct)
}
def search(x: Int, y: Int)(implicit session: Session): Option[(Coordinate, String)] = {
mytable.where(_.x === x).where(_.y === y).firstOption
}
}