簡體   English   中英

Slick-將Long隱式轉換為java.sql.Timestamp

[英]Slick - implicit conversion of Long to java.sql.Timestamp

Slick 2.1 Scala 2.11.7

無法獲得Long <-> java.sql.Timestamp或java.sql.Date工作的隱式轉換。 我讓他們為其他轉換工作,例如JodaTime.DateTime <-> java.sql.Timestamp ...

例如,查詢返回錯誤:

org.postgresql.util.PSQLException: ERROR: operator does not exist: 
timestamp with time zone >= bigint Hint: No operator matches 
the given name and argument type(s). You might need to add explicit type casts. 
Position: 325

這些是隱式的,它們肯定可以正確地導入范圍內:

implicit val LongToTimestamp = MappedColumnType.base[Long, Timestamp](
longTS => new Timestamp(longTS),
sqlTS => sqlTS.getTime
)

implicit val LongToDate = MappedColumnType.base[Long, java.sql.Date](
longTS => new java.sql.Date(longTS),
sqlDate => sqlDate.getTime
)

我也嘗試使用java.lang.Long代替:

implicit val LongToTimestamp = MappedColumnType.base[java.lang.Long, Timestamp](
longTS => new Timestamp(longTS),
sqlTS => sqlTS.getTime
)

implicit val LongToDate = MappedColumnType.base[java.lang.Long, java.sql.Date](
longTS => new java.sql.Date(longTS),
sqlDate => sqlDate.getTime
)

我在這里想念什么? 謝謝!

-

附加信息:

查詢方法定義為(排隊為java.sql.Timestamp):

def getJobs(jobTypeId: Short, onOrAfter: DateTime): Seq[JobRow] = {
 val q1 = for{j <- Jobs if j.jobTypeId === jobTypeId && j.queued >= onOrAfter.getMillis} yield j
 db.withSession{ implicit s =>
   q1.buildColl[Seq]
 }
}

表定義:

class Jobs(tag: Tag) extends Table[JobRow](tag, "job") {

def jobId = column[Long]("job_id", O.PrimaryKey, O.NotNull)

def jobTypeId = column[Short]("job_type_id", O.NotNull)

def queued = column[Long]("queued", O.NotNull)

def * = (jobId, jobTypeId, queued) <>((JobRow.apply _).tupled, JobRow.unapply_ )

def pk = primaryKey("job_pk", jobId)
}

您的問題是Postgres中的底層queued列不是bigint而是timestamp with time zonetimestamp with time zone 但是,在Slick的Jobs表定義中,您說該列是Long Slick已經知道如何將Long綁定到查詢,因此它從未嘗試使用您的隱式將Long轉換為它確實知道如何綁定的另一種類型。

理想情況下,您只需要使用sql.Timestamp作為Jobs.queued列類型(這是您對查詢代碼段的注釋似乎表明您認為是):

def queued = column[Timestamp]("queued", O.NotNull)
// As opposed to your example where this is
// def queued = column[Long]("queued", O.NotNull)

或者,您可以為to_timestamp(double)創建一個Slick包裝器:

val toTimestamp = SimpleFunction.unary[Double, Timestamp]("to_timestamp")
val q1 = for {
  j <- Jobs
  if j.jobTypeId === jobTypeId && j.queued >= toTimestamp(onOrAfter.getMillis)
} yield j

最后,您可以向Postgres DB添加自動轉換以進行轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM