下面我已经在Postgres中使用了Java 8和Postgres-11和Spring 我已经通过了this question和this question,但是我真的很想使用Java8DataAPI,而不是Java7。
CREATE TABLE note(
note_id serial PRIMARY KEY,
message varchar(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);我创建了如下所示的模型类,但与我所需要的不匹配。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Entity
public class Note extends AuditEnabledEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "note_id")
private int noteId;
@Column(name = "message")
private String message;
@Column(name = "created_at")
private LocalDateTime createdAt;
}发布于 2019-07-08 15:40:24

错误类型
LocalDateTime在这里是错误的类型。正如在Javadoc中所解释的那样,这个类不能表示瞬间。
该类故意没有时区的概念,也没有与世界协调时相抵消的概念。因此,它代表了一个日期和一个时间,比如“2019年1月23日的中午”,但不知道那是东京、巴黎或蒙特雷的中午,例如,三个非常不同的时刻,相隔几个小时。因此,这种类型适用于标准的SQL类型TIMESTAMP WITHOUT TIME ZONE -没有,而不是使用。
有关更多讨论,请参见:https://stackoverflow.com/q/32437550/642706
右型
对于标准的SQL类型TIMESTAMP WITH TIME ZONE,您应该使用Instant、OffsetDateTime或ZonedDateTime类型。其中,JDBC4.2只需要对第二个OffsetDateTime的支持。
检索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;从Postgres检索的值将始终以UTC为单位。SQL标准没有指定此行为,因此数据库有所不同。在Postgres中,发送到TIMESTAMP WITH TIME ZONE类型字段的任何值都会调整为UTC。检索到的值以UTC表示。
储存。
myPreparedStatement.setObject( … , odt ) ;从世界协调时(零偏移)调整到特定地区(时区)的人使用的挂钟时间。
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;JPA
我不使用JPA,我更喜欢保持简单。
但是根据this Answer的说法,JPA2.2支持java.time类型。
Hibernate也支持java.time。
https://stackoverflow.com/questions/56938079
复制相似问题