Spring Boot版本'2.3.4.RELEASE'
Java 11语言
引导程序:spring-boot-starter-jdbc
引导程序:启动程序
spring-data-jpa-2.3.4.RELEASE
运行时(mysql:mysql连接器-java)
服务器数据库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月8日03:23:38.454
但使用hib/JPA时,结果为FALSE。
两柴追踪:
2020-10-09 22:26:53.120休眠状态:插入到date_test(日期)值中(?)
2020-10-09 22:26:53.122 TRACE 95038 --- [重新启动主文件] o. h.类型.描述符.sql.基本活页夹:绑定参数[1]为[时间戳] - [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的结果:使用Hibernate sql insert时,小数秒始终设置为**.000**:
2020年10月9日22时26分53秒000秒
请帮助。我需要保存到数据库的时间与毫秒精度抛出JPA。
UPD:
我尝试SQL方言:
我的数据库的方言比我的数据库的方言比我的方言
但没有成功。
UPD 1:
Hibernate:INSERT INTO日期测试(时间戳,本地日期时间,本地日期时间a)VALUES(NOW(3),?,?)
2020年10月10日15:33:29.099 TRACE 44072 --- [重启主程序] o. h.类型.描述符.sql.基本绑定器:绑定参数[1]为[时间戳] - [2020-10-10 15:33:29.051]
2020年10月10日15:33:29.100 TRACE 44072 --- [重启主程序] o. h.类型.描述符.sql.基本绑定器:[2]参数绑定为[时间戳] - [java.util.GregorianCalendar[时间=1602336809051,字段设置=true]
结果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秒
休眠:选择日期测试do 0_.时间戳作为时间戳1_0_ from日期测试日期测试do 0_ where日期测试do 0_.时间戳〉?
绑定参数[1]为[时间戳] - [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数据库:
从日期测试中选择时间戳,其中时间戳〉“2020-10-10 16:20:47.893”
2020年10月10日16时20分47.896秒
2020年10月10日16时20分47.900秒
jpa/hib无法使用毫秒...
3条答案
按热度按时间wh6knrhe1#
从JPA2.2开始就支持java8的日期和时间API。我还没有尝试过它是否能解决你的问题,但是你能用java8的
LocalDateTime
代替Calendar
类型吗?替换:
gzjq41n42#
请尝试使用此方法,而不要使用new Date()
um6iljoc3#
这不是一个直接的解决方案,而是一个变通方案,非常有效:与存储实际日期不同,只需存储日期的
long
值,通过调用date.getTime()
方法,存储此结果,当从日期获取日期时,使用new Date(longValue)
,使用存储在数据库中的longValue
重新创建原始日期,此方法至少保留了毫秒精度