首页 > 解决方案 > Spring Boot JPA Hibernate - 以毫秒精度存储日期

问题描述

Spring Boot 版本“2.3.4.RELEASE”
Java 11
org.springframework.boot:spring-boot-starter-jdbc
org.springframework.boot:spring-boot-starter-data-jpa
spring-data-jpa-2.3.4。发布
运行时(mysql:mysql-connector-java)

服务器数据库 MariaDB (ver. 10.5.5-MariaDB)
Java MariaDB 连接器 J:2.6.0[稳定]

我正在尝试以毫秒精度在 Hibernate 中保留 java.sql.Timestamp 对象。我需要以毫秒为单位将日期保存到数据库。例如:2020-10-08 03:23:38.454。

我的域名:

import java.sql.Timestamp;
@Entity
@Data
@Table(name = "date_test")
public class DateTestDomain {
    @Id
    @Column(nullable = false, name = "date", columnDefinition = "TIMESTAMP(3)")
    @Temporal(TIMESTAMP)
    private Calendar dateTest;
}

我的回购:

@Repository
public interface DateTestRepo extends JpaRepository<DateTestDomain, Timestamp> {
}

将日期保存到数据库:

private final JdbcTemplate db;
...
        long testTime = 1602120218454L;
        Timestamp dateTimeStamp = new Timestamp(testTime);
        db.update("INSERT INTO date_test" + " (date) VALUES( \"" + dateTimeStamp + "\")");

UPD:sql的结果是正确的,因为我需要!!!这种方法工作完美:2020-10-08 03:23:38.454

但是使用休眠/JPA 结果是 FALSE。
调试跟踪:
2020-10-09 22:26:53.120 休眠:插入 date_test(日期)值(?)
2020-10-09 22:26:53.122 TRACE 95038 --- [restartedMain] ohtype.descriptor.sql.BasicBinder :绑定参数 [1] 作为 [TIMESTAMP] - [2020-10-09 22:26:53.044]

        Calendar calendar = Calendar.getInstance();
        Date date = new Date();
        calendar.setTimeInMillis(date.getTime());
        dateTestDomain.setDateTest(calendar);

        dateTestRepo.save(dateTestDomain);

sql 的结果:小数秒总是设置为.000与休眠 sql 插入:

2020-10-09 22:26:53.000

请帮忙。我需要以毫秒精度抛出 JPA 保存到数据库时间。

升级版:

我尝试 sql dialect:
org.hibernate.dialect.MySQL5InnoDBDialect 比 org.hibernate.dialect.MySQL55InnoDBDialect 比 org.hibernate.dialect.MariaDB103Dialect 比 org.hibernate.dialect.MariaDB105Dialect
没有成功。
UPD 1:
休眠:INSERT INTO date_test(时间戳,local_date_time,local_date_timea)值(NOW(3),?,?)
2020-10-10 15:33:29.099 TRACE 44072 --- [restartedMain] ohtype.descriptor.sql。 BasicBinder:绑定参数 [1] 作为 [TIMESTAMP] - [2020-10-10 15:33:29.051]
2020-10-10 15:33:29.100 TRACE 44072 --- [restartedMain] ohtype.descriptor.sql.BasicBinder:绑定参数 [2] 作为 [TIMESTAMP] - [java.util.GregorianCalendar[time=1602336809051,areFieldsSet=true...

结果 SQL:
2020-10-10 15:33:29.101、2020-10-10 13:33:29.000、2020-10-10 15:33:29.000。

还有一个问题:
数据库日期:
2020-10-10 16:19:42.578
2020-10-10 16:20:47.000
2020-10-10 16:20:47.888
2020-10-10 16:20:47.892
2020- 10-10 16:20:47.896
2020-10-10 16:20:47.900
休眠:从 date_test datetestdo0_ 中选择 datetestdo0_.timestamp 作为 timestam1_0_ 其中 datetestdo0_.timestamp>?
绑定参数 [1] 作为 [TIMESTAMP] - [2020-10-10 16:20:47.893]
2020-10-10 16:20:47.888
2020-10-10 16:20:47.892
2020-10-10 16:20 :47.896
2020-10-10 16:20:47.9

jdbcsql:
从 date_test 中选择时间戳,其中时间戳>“2020-10-10 16:20:47.893”
2020-10-10 16:20:47.896
2020-10-10 16:20:47.900

jpa/hibernate 不能以毫秒为单位工作......

标签: javahibernatespring-data-jpamariadb

解决方案


从 JPA 2.2 开始支持 java8 日期和时间 API。我没有尝试过它是否可以解决您的问题,但您可以尝试使用 java8LocalDateTime而不是Calendartype。

代替:

@Id
@Column(nullable = false, name = "date", columnDefinition = "TIMESTAMP")
@Temporal(TIMESTAMP)
private LocalDateTime localDateTime;

推荐阅读