我正在尝试为新的 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]
我基本上陷入了依赖注入(inject),隐式 hell 。有人想出了在 Slick 3 中维护自定义转换的好方法吗?请分享。
最佳答案
这就是特质派上用场的地方:
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
}
关于scala - 在 slick 3 项目中管理 MappedColumnType 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34567305/