在光滑3项目中管理MappedColumnType转换

时间:2016-01-02 15:03:37

标签: scala slick slick-3.0

我正在尝试为新的Slick 3项目构建自定义数据库列转换器。使用MappedColumnType很容易制作这些,但你必须导入驱动程序api。对于单个DAO类中的一次性类型,这是直截了当的。但我想在所有DAO对象中使用我的自定义列类型。我无法以编译器可以识别隐含的方式构造我的导入。

以下是我想要构建的库类型的示例。它有一个转换器,非常类似于在许多Slick 2示例中看到的无处不在的Joda日期转换器。

package dao

import java.sql.Date

import data.Timestamp
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider}
import slick.driver.JdbcProfile

case class StandardConversions(protected val dbConfigProvider: DatabaseConfigProvider)
  extends HasDatabaseConfigProvider[JdbcProfile] {
  import driver.api._

  implicit val timestampColumnType = MappedColumnType.base[Timestamp, Date](
    { data => new Date(data.value) },
    { sql => Timestamp(sql.getTime) }
  )

}

在DAO课程中,我尝试像这样进行导入:

val conversions = StandardConversions(dbConfigProvider)
import conversions._

编译器错误是熟悉的:

could not find implicit value for parameter tt: slick.ast.TypedType[data.Timestamp]

我基本上陷入依赖注入,隐含地狱。有没有人想出一个在Slick 3中维护自定义转换的好方法?请分享。

2 个答案:

答案 0 :(得分:2)

这就是特质派上用场的地方:

package dao

import java.sql.Date
import data.Timestamp

import play.api.db.slick.HasDatabaseConfig
import slick.driver.JdbcProfile

trait StandardConversions extends HasDatabaseConfigProvider[JdbcProfile] {
  import driver.api._

  implicit val timestampColumnType = MappedColumnType.base[Timestamp, Date](
    { data => new Date(data.value) },
    { sql => Timestamp(sql.getTime) }
  )
}

然后只需在你的DAO中扩展这个特性:

class SomeDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider)
  extends HasDatabaseConfigProvider[JdbcProfile]
  with StandardConversions {

  import driver.api._

  // all implicits of StandardConversions are in scope here
}

答案 1 :(得分:0)

结合Roman的解决方案,您应该添加以下导入:

import play.api.libs.concurrent.Execution.Implicits.defaultContext