当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA Hibernate-以毫秒级精度存储日期

呼延原
2023-03-14

Spring启动版本“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.release
运行时(mysql:mysql-connector-java)

服务器DB MariaDB(版本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

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

        dateTestRepo.save(dateTestDomain);

我尝试了sql方言:
org.hibernate.dialt.mysql5InnoDbDialogue than org.hibernate.dialt.mysql55InnoDbDialogue than org.hibernate.dialt.mariadb103Dialogue than org.hibernate.dialt.mariadb105Dialogue than org.hibernate.dialt.mariadb105Dialogue than org.hibernate.dialt.mariadb105Dialogue than org.hibernate.dialt.mariadb105Dialogue

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

还有一个问题:
DB日期:
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
Hibernate:select datetestdo0_.TIMESTAMP作为timestam1_0_from date_test datetestdo0_where datetestdo0_.TIMESTAMP>?
绑定参数[1]作为

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无法工作毫秒...

共有1个答案

巫化
2023-03-14

由于JPA2.2支持java8日期和时间API。我没有尝试过它是否可以解决您的问题,但您是否可以尝试使用Java8的localdatetime而不是calendar类型。

替换:

@Id
@Column(nullable = false, name = "date", columnDefinition = "TIMESTAMP")
@Temporal(TIMESTAMP)
private LocalDateTime localDateTime;
 类似资料:
  • 我现在用SDL2编程。所有这些都可以正常工作,但我对方法有一个问题。通常,它应该以毫秒为单位返回应用程序的总时间,但它总是在大部分时间返回值0,有时返回值1。 我用标志初始化SDL。 以下代码的问题是循环太快,因此增量时间小于1 ms。是否有方法实现更高的精度?

  • 我在代码中使用倒计时。问题是,倒计时不准确。onTick方法并不总是每秒执行一次,它可能需要几毫秒的时间。当试图基于millisUntilFinished执行某项任务时,这会成为一个问题。当我的20秒计时器超过10秒时,我正在尝试登录: 以下是相关代码: 这里出现了一个问题,因为countDownTimer可能永远不会有millisUntilFinished==10000,它可能等于1001,因此

  • 在Java 8中有可能获得微秒吗?Java 8类有一个方法,该方法旨在返回,但在Linux(Ubuntu)和OS X(10.11.5)上,它只返回(当我运行它时,它返回,它等于),我确实需要能够获得。 因为javascript方法返回一个精确值,所以可以在我的计算机上获得(因此可以从中获得)。 在任何人开始精确与精确的争论之前,我知道纳秒在线程之间是完全不可靠的,不应该用于比较。 编辑: 所以我意

  • sleep(500)将挂起当前线程至少500毫秒,我知道它可能会比500多一点,但绝不会少于这个时间。现在,1毫秒=1000000纳秒,我想暂停当前线程500毫秒,即=500*1000000纳秒,但当我运行以下代码时,它有时睡眠时间少于指定的纳秒值。这是为什么呢?以及如何至少睡500*1000000纳秒。 有时输出是

  • 问题内容: 因此,我刚刚发现MySQL中最令人沮丧的错误。 显然,该字段及其支持功能不支持比秒更高的精度! 所以我正在使用PHP和Doctrine,我真的需要那些微秒(我正在使用属性)。 我发现我可以使用一个字段来存储值。但是学说会增加毫秒吗?我认为它只是将NOW()分配给该字段。我还担心通过代码散布的日期操作功能(在SQL中)会中断。 我还看到了有关编译UDF扩展的内容。这是不可接受的,因为我或

  • 问题内容: 我必须使用MySQL开发应用程序,并且必须保存“ 1412792828893”之类的值,该值代表时间戳,但精度为毫秒。即,自1970年1月1日以来的毫秒数。我声明该行为,但不幸的是,这行不通。所有值均设置为 为了能够以这种精度保存时间戳记值,如何声明? 问题答案: 您需要使用MySQL 5.6.4或更高版本,才能声明具有小数秒时间数据类型的列。不确定您使用的版本正确吗?尝试。如果遇到错