使用 Spring Data 的 postgres 中的时间戳出错:列 $COLUMN_NAME 是没有时区的时间戳类型,但表达式是 bytea 类型

Posted

技术标签:

【中文标题】使用 Spring Data 的 postgres 中的时间戳出错:列 $COLUMN_NAME 是没有时区的时间戳类型,但表达式是 bytea 类型【英文标题】:Error with timestamp in postgres using Spring Data: column $COLUMN_NAME is of type timestamp without time zone but expression is of type bytea 【发布时间】:2018-12-31 09:43:08 【问题描述】:

使用以下内容:

Oracle JDK 1.8.0._171

Spring boot 1.5.9-RELEASE

PostgreSQL 9.6

Postgres 驱动程序:42.2.4

从以下定义中得到错误:

表格栏: sql meal_time TIMESTAMP DEFAULT now() NOT NULL

实体属性定义: java @Column(name = "meal_time", nullable=false) private Instant mealTime = Instant.now();

每当我尝试刷新或查询实体时都会抛出错误:

Caused by: org.postgresql.util.PSQLException: ERROR: column "meal_time" is of type timestamp without time zone but expression is of type bytea
  Hint: You will need to rewrite or cast the expression.

我可以为这个领域编写一个转换器,但应该有一个标准的方式,感觉就像我在寻找一些我发现非常接近的实际工作的实现的例子时遗漏了一些东西。

【问题讨论】:

您是否尝试过在您的依赖项中包含hibernate-java-8spring-boot-starter-data-jpa:1.5.9 依赖于 hibernate-core:5.0.12,它不包括对 Java 8 的日期和时间 API 类型 AFAIK 的支持(不过,我认为它包含在 hibernate-core 中,适用于较新的 Hibernate 版本) @crizzis - 感谢您的反馈。只是按照您的建议尝试,但不幸的是同样的错误仍然存​​在。我现在将编写一个转换器,但仍在寻找更好的标准解决方案。 您在哪里告诉您的 JPA 提供者将 Instant 保留为 TIMESTAMP?你还没有 【参考方案1】:

经过一番研究,我从 postgres 官方文档中找到了 this page, Using Java 8 Date and Time classes,并将属性类型更改为 LocalDateTime 而不是 Instant:

java @Column(name = "meal_time", nullable = false) private LocalDateTime mealTime = LocalDateTime.now();

这解决了问题,并且是该特定项目中可接受的解决方案。

【讨论】:

【参考方案2】:

正如@crizzis 指出的那样,在 Hibernate 核心模块 org.hibernate:hibernate-core (https://mvnrepository.com/artifact/org.hibernate/hibernate-core) 中,Java 8 类型映射,包括从/到 java.time.Instant 的映射,都包含在 5.2 及更高版本中。如果使用 5.1 之前的 hibernate-core 版本,这些类型映射包含在特殊模块 org.hibernate:hibernate-java8 (https://mvnrepository.com/artifact/org.hibernate/hibernate-java8) 中。请注意,此模块在 5.2 版(已移至 hibernate-core)中为空,因此我建议使用 5.1.17.Final 版,例如

compile group: 'org.hibernate', name: 'hibernate-core', version: '5.4.16.Final'

【讨论】:

以上是关于使用 Spring Data 的 postgres 中的时间戳出错:列 $COLUMN_NAME 是没有时区的时间戳类型,但表达式是 bytea 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Data / JPA 插入 Postgres Array 类型列?

Spring Data JPA 方法或查询以使用 Postgres 列执行算术运算

Spring Data Rest:“日期为空”查询引发 postgres 异常

Spring Data 配置和 Postgres 数据库集成(无 xml 配置)

使用带有 Spring Data 和绑定参数的 Postgres JSONB 查询失败并出现 InvalidDataAccessApiUsageException

Postgres - Spring Data JPA - 自动生成数据库和表