2016-11-10 3 views
0

私は滑らかなデータベーステーブルにこのマッピングにケースクラスの操作を行うことができます -デフォルト以外のフィールドタイプのケースクラスを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を苦労の日後

+0

どのバージョンのSlickをお使いですか? –

+0

3.1.1を使用して、私は以下の答えを見つけたと思う。それはスカラー暗黙の解決策である。応答してくれてありがとう。 – user2056182

答えて

1

は答えを見つけた: -/

問題は暗黙のMappedColumnTypeテーブルクラスの後に宣言されたということでした。何らかの理由でこれがテーブルの上にインポートしたとしても暗黙的な解決を混乱させます。

ケースクラスを削除して単純にタプルを使用したときの回答が見つかりました。私は次のエラーがそうソリューション明確にすることが

[info] Compiling 1 Scala source to target/scala-2.11/classes... 
[error] /db/Tables.scala:100: 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:102: type mismatch; 
[error] found : (slick.lifted.Rep[Option[Long]], slick.driver.H2Driver.api.Rep[java.time.LocalDateTime]) 
[error]  (which expands to) (slick.lifted.Rep[Option[Long]], slick.lifted.Rep[java.time.LocalDateTime]) 
[error] required: slick.lifted.ProvenShape[(Option[Long], java.time.LocalDateTime)] 
[error] Note: implicit value localDateTimeToTimestamp is not applicable here because it comes after the application point and it lacks an explicit result type 
[error] def * : ProvenShape[(Option[Long], LocalDateTime)] = (id.?, time) 
[error]              ^

を提示したことがなかった場合には、同じファイルであれば、テーブル定義上の暗黙的な変換を置くか、別のファイルに入れて、それをインポートし、ワーキング溶液を見ていました以下。ありがとう。

case class SomeLocalDate(id: Option[Long], timestamp: java.time.LocalDateTime) 

object LocalDateTableConversions { 
    implicit val localDateTimeToTimestamp = MappedColumnType.base[LocalDateTime, Timestamp](
    { Timestamp.valueOf(_) } , 
    { ts => ts.toLocalDateTime } 
) 
} 
import LocalDateTableConversions._ 

class LocalDateTable(tag: Tag) extends Table[SomeLocalDate](tag, "TLDATE_TABLE") { 
    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) 
} 
関連する問題