Postgresql Slick-Long到java.sql.Timestamp的隐式转换

Postgresql Slick-Long到java.sql.Timestamp的隐式转换,postgresql,scala,slick,Postgresql,Scala,Slick,光滑2.1 Scala 2.11.7 无法获取长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

光滑2.1 Scala 2.11.7

无法获取长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
)
我错过了什么?谢谢大家!

--

其他信息:

查询方法定义为(queued是java.sql.Timestamp):

def getJobs(jobTypeId:Short,onOrAfter:DateTime):Seq[JobRow]={
val q1=对于{j=onOrAfter.getMillis}j
db.withSession{implicit s=>
q1.buildColl[如下]
}
}
表定义:

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)
}
类作业(标记:标记)扩展表[JobRow](标记,“作业”){
def jobId=列[Long](“作业id”,O.PrimaryKey,O.NotNull)
def jobTypeId=列[Short](“作业类型id”,O.NotNull)
def queued=列[Long](“排队”,O.NotNull)
def*=(jobId,jobTypeId,排队)((JobRow.apply u41;).tuple,JobRow.unapply 41;
def pk=primaryKey(“作业主键”,作业ID)
}

您这里的问题是,Postgres中的基本
队列
列不是
bigint
,而是带有时区的
时间戳
。但是,在Slick的
作业
表定义中,您说该列是
长的
。Slick已经知道如何将Long绑定到查询,因此它从不尝试使用隐式将Long转换为另一种它确实知道如何绑定的类型

理想情况下,您只需使用
sql.Timestamp
作为
作业.queued
列类型(您对查询片段的注释似乎表明您认为它是):

或者,您可以为
to\u时间戳(double)
创建一个光滑的包装:

val-toTimestamp=SimpleFunction.unary[Double,Timestamp](“to_Timestamp”)
val q1=用于{
j=总时间戳(onOrAfter.getMillis)
}产量j

最后,您可以将自动转换添加到Postgres DB以进行转换。

问题不在于您的映射,而在于您的查询-您能告诉我们如何生成查询吗?(Long按原样绑定,未转换为时间戳,导致错误)。或者,您的隐式可能被Slick的默认隐式所遮蔽。感谢您的关注。我添加了表定义和查询示例。感觉就像是你的第二个想法,Slick的默认含义正在占据主导地位,而我的则被忽略了。我不知道怎么解决。谢谢肖恩。我天真地认为应该使用我的隐式,因为Slick没有很长的时间戳绑定。是否有一种解决方案,可以在不涉及DB函数或特性的情况下,在光滑的一侧进行长时间戳转换?此后,我在my模型中继续使用ZoneDateTime,并使用了一个隐式的,但这仍然困扰着我。问题是,您告诉Slick该列是一个
Long
-Slick没有根据实际表的模式对您的模式进行双重检查,因此它很高兴地将
getMillis
中的
Long
绑定到查询中,导致Postgres抛出错误。如果您从
def queued=column[Long]
更改为
def queued=column[Timestamp]
您将在编译时在
getJobs
方法中得到不同的错误,然后您可以解决这些错误。如果使用column[Timestamp],但JobRow类保持Long,那么长时间戳之间的隐式转换是否有效?或者我需要在def*=。。。行?您需要在映射
*
方法中进行自定义转换。
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)
}
def queued = column[Timestamp]("queued", O.NotNull)
// As opposed to your example where this is
// def queued = column[Long]("queued", O.NotNull)
val toTimestamp = SimpleFunction.unary[Double, Timestamp]("to_timestamp")
val q1 = for {
  j <- Jobs
  if j.jobTypeId === jobTypeId && j.queued >= toTimestamp(onOrAfter.getMillis)
} yield j