【发布时间】:2021-01-23 11:42:18
【问题描述】:
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.RELEASE
运行时(mysql:mysql-connector-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-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方言:
org.hibernate.dialect.MySQL5InnoDBDialect 比 org.hibernate.dialect.MySQL55InnoDBDialect 比 org.hibernate.dialect.MariaDB103Dialect 比 org.hibernate.dialect.MariaDB105Dialect
没有成功。
UPD 1:
休眠: INSERT INTO date_test (timestamp, local_date_time, local_date_timea) VALUES (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=真的……
结果 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_ where 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 无法使用毫秒...
【问题讨论】:
-
您可以将格式化的时间字符串附加到 sql 中,精度为毫秒。 stackoverflow.com/questions/1459656/…
-
格式化字符串?我有时间戳 - 格式为毫秒的时间戳。
-
将 .append(dateTimeStamp) 替换为 .append(YourFormattedString)。您可以在链接中找到如何获取表示日期和时间的格式化字符串
-
@Dario 在这个地方 - 这不是我的问题。 jdbctemplate 工作正常,但在最后 3 行:我的问题 hibernate dateTestRepo.save(dateTestDomain) 始终设置为 .000 时间戳。这是我的问题。我,不需要将时间戳格式化为字符串或更改 sql 查询,我需要 jpa 将我的时间戳保存到数据库,毫秒与 jdbctemplate 相同。
-
对于初学者,您应该比较相同的事物。您正在做的是将带有
Timestamp.toString结果的静态 SQL 传递到查询中。您应该做的是db.update("INSERT INTO date_test (date) VALUES(?);", timestamps);,因为这将使用 JPA/hibernate 也在使用的正确 sql 转换。最后在你的字段定义中添加一个@Temporal(TIMESTAMP)。
标签: java hibernate spring-data-jpa mariadb