java - 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 不能以毫秒为单位工作......
解决方案
从 JPA 2.2 开始支持 java8 日期和时间 API。我没有尝试过它是否可以解决您的问题,但您可以尝试使用 java8LocalDateTime
而不是Calendar
type。
代替:
@Id
@Column(nullable = false, name = "date", columnDefinition = "TIMESTAMP")
@Temporal(TIMESTAMP)
private LocalDateTime localDateTime;
推荐阅读
- java - 用于发送 HTTP 请求并显示通知的后台服务
- php - ElasticSearch 同义词路径的文件权限
- css - 单选按钮的点和标签之间有更多空间
- angular - Angular 5 未在 Firefox 中正确处理 301 响应
- angularjs - 从正则表达式 angularjs 中删除“/”
- jquery - jquery - 使用ajax后查找id
- c# - 我如何在字符串中使用代码并且不让它执行?
- javascript - 如何使用 selenium 和 python 单击多个按钮或链接深度?
- parameters - Azure 数据工厂使用文件名 DataSink 中的查找结果
- javascript - 如何抓取国际足联网站的 javascript 表格