将表列的光滑转换为案例类

时间:2014-10-22 09:49:50

标签: scala slick

我使用的是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。我知道你可以在你的表的所有列和一个案例类之间提供转换,有没有办法只转换一些列,因为我喜欢这里?

感谢。

1 个答案:

答案 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
  }

}