首页 > 解决方案 > Postgres 的 AT TIME ZONE 不能在休眠状态下工作

问题描述

休眠查询

SELECT l.submissionDate from Lead l where date(TIMESTAMP l.submissionDate AT TIME ZONE :userOffset) = date(:submissionDate)

正在抛出以下问题

11:08:13.248 [http-nio-8080-exec-5] ERROR o.h.hql.internal.ast.ErrorTracker - line 1:89: unexpected token: AT
antlr.NoViableAltException: unexpected token: AT

标签: postgresqlhibernatetimezone

解决方案


我看到几个问题。首先,您似乎正在使用带有 createQuery 的 HQL/JPQL 查询,并且AT TIME ZONEHQL 不支持该语法,因此您必须改用本机查询。这意味着您必须对所有内容使用 SQL 本地名称,而不是 Java 字段名称。

第二次比较 where 子句中的两个用户传递的参数是没有意义的。我认为,而不是:

date(TIMESTAMP '2018-03-31T21:45:00.000+0000' AT TIME ZONE :userOffset) = date(:submissionDate)

你的意思是:

date(l.submissionDate AT TIME ZONE :userOffset) = date(:submissionDate)

现在,添加更正,并假设您遵循常识命名约定,您的表和字段名称将转换为:

SELECT l.submission_date from lead l where date(l.submission_date AT TIME ZONE :userOffset) = :submissionDate

并且您的 submitDate 参数必须是 ajava.sql.Date或 a java.time.LocalDate,因此您不需要转换。


推荐阅读