私は滑らかなデータベーステーブルにこのマッピングにケースクラスの操作を行うことができます -デフォルト以外のフィールドタイプのケースクラスをSlickのテーブルにマップするにはどうすればよいですか?
case class SomeTimeStamp(id: Option[Long], timestamp: java.sql.Timestamp)
class TimeStampTable(tag: Tag) extends Table[SomeTimeStamp](tag, "TSTAMP_TABLE") {
def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
def time = column[java.sql.Timestamp]("TIME")
def * = (id.?, time) <> (SomeTimeStamp.tupled, SomeTimeStamp.unapply)
}
ケースクラスがツルツルで、デフォルトではデータベース型に変換されているフィールドを持っているので、すべてが順調です。
私のケースクラスのフィールドがデフォルトのデータベースタイプではない場合、これは機能しません。 Slickは、MappedColumnTypeを使用して有効なデータベースタイプとの間で暗黙的な変換を提供できるようにしました。このため、SQLのタイムスタンプよりJava LocalDatetimeを使用しています。
case class SomeLocalDate(id: Option[Long], timestamp: java.time.LocalDateTime)
class LocalDateTable(tag: Tag) extends Table[SomeLocalDate](tag, "TLDATE_TABLE") {
import LocalDateTable._
def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
def time = column[java.time.LocalDateTime]("TIME")
def * = (id.?, time) <> (SomeLocalDate.tupled, SomeLocalDate.unapply)
}
object LocalDateTable {
implicit val localDateTimeToTimestamp = MappedColumnType.base[LocalDateTime, Timestamp](
{ Timestamp.valueOf(_) } ,
{ ts => ts.toLocalDateTime }
)
}
私が追加されていると、暗黙的なマッピングされた列に、私はまだ投影でコンパイルエラーと暗黙の解像度を得る コンパイルエラーは次のとおりです。 -
[info] Compiling 1 Scala source to ...target/scala-2.11/classes...
[error] db/Tables.scala:92: could not find implicit value for parameter tt: slick.ast.TypedType[java.time.LocalDateTime]
[error] def time: Rep[LocalDateTime] = column[java.time.LocalDateTime]("TIME")
は、私はデフ時間を変更し、追加した場合私は別のエラーを取得します、以下を参照してください。
case class SomeLocalDate(id: Option[Long], timestamp: java.time.LocalDateTime)
class LocalDateTable(tag: Tag) extends Table[SomeLocalDate](tag, "TLDATE_TABLE") {
import LocalDateTable._
def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
def time: Rep[LocalDateTime] = column[java.time.LocalDateTime]("TIME")
def * = (id.?, time) <> (SomeLocalDate.tupled, SomeLocalDate.unapply)
}
object LocalDateTable {
implicit val localDateTimeToTimestamp = MappedColumnType.base[LocalDateTime, Timestamp](
{ Timestamp.valueOf(_) } ,
{ ts => ts.toLocalDateTime }
)
}
は、このエラーを与える: -
[info] Compiling 1 Scala source to ...target/scala-2.11/classes...
[error] db/Tables.scala:92: could not find implicit value for parameter tt: slick.ast.TypedType[java.time.LocalDateTime]
[error] def time: Rep[LocalDateTime] = column[java.time.LocalDateTime]("TIME")
[error] ^
[error]db/Tables.scala:94: No matching Shape found.
[error] Slick does not know how to map the given types.
[error] Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List).
[error] Required level: slick.lifted.FlatShapeLevel
[error] Source type: (slick.lifted.Rep[Option[Long]], slick.lifted.Rep[java.time.LocalDateTime])
[error] Unpacked type: (Option[Long], java.time.LocalDateTime)
[error] Packed type: Any
[error] def * = (id.?, time) <> (SomeLocalDate.tupled, SomeLocalDate.unapply)
[error] ^
[error] two errors found
ケースクラスは、デフォルトでは、データベースの種類(例えばLocalDateTimeを)をサポートしていない場合、私はテーブルにケースクラスをマッピングするために行うには何がありますか?
歓声Iを苦労の日後
どのバージョンのSlickをお使いですか? –
3.1.1を使用して、私は以下の答えを見つけたと思う。それはスカラー暗黙の解決策である。応答してくれてありがとう。 – user2056182