2016-04-17 10 views
2

私はSlick 3.1.0を使用しており、java.time.LocalDate型のフィールドを永続化する必要があります。Slick 3 java.time.LocalDate mapping

私はモデルクラスを持っている:

case class Position(companyName: String, title: String, startDate: Option[LocalDate], endDate: Option[LocalDate], positionId: Option[Int] = None) 

そして、次のマッピング:

private[PositionTable] class PositionTable(tag: Tag) extends Table[Position](tag, "POSITIONS") { 
    val positionId = column[Int]("POSITION_ID", O.PrimaryKey, O.AutoInc) 
    val companyName = column[String]("COMPANY_NAME") 
    val title = column[String]("TITLE") 
    val startDate = column[Date]("START_DATE") 
    val endDate = column[Date]("END_DATE") 
    def * = (companyName, title, startDate, endDate, positionId.?) <>(Position.tupled, Position.unapply) 
} 

は、どのように私は、データベースにDATE型で表現するたstartDateとendDateにフィールドをマップすることができますか?

列マッパーでのNullPointerExceptionのためのスタックトレース:

java.lang.NullPointerException 
    at com.tiedin.repo.PositionTable$class.$init$(PositionRepository.scala:54) 
    at repo.PositionRepositoryTest.<init>(PositionRepositoryTest.scala:13) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at java.lang.Class.newInstance(Class.java:442) 
    at org.scalatest.tools.Runner$.genSuiteConfig(Runner.scala:1422) 
    at org.scalatest.tools.Runner$$anonfun$31.apply(Runner.scala:1236) 
    at org.scalatest.tools.Runner$$anonfun$31.apply(Runner.scala:1235) 
    at scala.collection.immutable.List.map(List.scala:273) 
    at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1235) 
    at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1011) 
    at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1010) 
    at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1500) 
    at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1010) 
    at org.scalatest.tools.Runner$.run(Runner.scala:850) 
    at org.scalatest.tools.Runner.run(Runner.scala) 
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138) 
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

答えて

5

ステップ:

  1. Option[LocalDate]に暗黙のMappedColumnType
  2. 変化型PositionTableDateを定義します。あなたのモデルクラスから判断すると、私はstartDateendDateがnullであると思います。そうでない場合は、Optionを省略します。
  3. あなたは

例行われている:あなたが特色にカスタムマップされた列の型を抽出し、もちろん他のDBのクラスでそれらを再利用することができ

import java.sql.Date 
import java.time.LocalDate 
// other imports 

class SomeDbClass { 
    implicit val localDateToDate = MappedColumnType.base[LocalDate, Date](
    l => Date.valueOf(l), 
    d => d.toLocalDate 
) 

    private[PositionTable] class PositionTable(tag: Tag) extends Table[Position](tag, "POSITIONS") { 
    val positionId = column[Int]("POSITION_ID", O.PrimaryKey, O.AutoInc) 
    val companyName = column[String]("COMPANY_NAME") 
    val title = column[String]("TITLE") 
    val startDate = column[Option[LocalDate]]("START_DATE") 
    val endDate = column[Option[LocalDate]]("END_DATE") 
    def * = (companyName, title, startDate, endDate, positionId.?) <>(Position.tupled, Position.unapply) 
    } 
} 

を。

さらに読書:Using Custom Scalar Types in Queries

+0

私は暗黙のvalをlocalDateToDateに値が割り当てられているラインでそれをテストしようとしていたときに、次のコードは、NullPointerExceptionが生成されます。 –

+0

@IlyaZinkovich滑らかなドライバーがありますか?あなたの質問にスタックトレースを追加してください。 – Roman

+0

質問が更新され、stacktraceが追加されました –