在普通的Java API中,时间的精度未被定义。当处理时间数据时,您可能想要在数据库中描述预期的精度。时间数据可以具有日期、时间或时间戳精度(即实际日期、仅时间或两者)。使用@Temporal注释来微调它。
“时间的精度未被定义”是什么意思?什么是“时间”的数据及其精度?它如何进行微调?
此注解必须指定为类型为java.util.Date
和java.util.Calendar
的持久字段或属性。它只能用于这些类型的字段或属性。
Temporal
注解可以与Basic
注解、Id
注解或ElementCollection
注解(当元素集合值是这种时间类型时)一起使用。
在普通的Java API中,时间的精确度未定义。处理时间数据时,您可能想在数据库中描述预期的精度。时间数据可以具有DATE、TIME或TIMESTAMP精度(即实际日期、仅时间或两者)。使用@Temporal
注解来微调它。
时间数据是与时间相关的数据。例如,在内容管理系统中,文章的创建日期和最后更新日期是时间数据。在某些情况下,时间数据需要精度,您想在数据库表中存储精确的日期/时间或两者(TIMESTAMP
)。
核心Java API未指定时间精度。@Temporal
是一个JPA
注解,可在时间戳和java.util.Date
之间进行转换。它还会将时间戳转换为时间。例如,在下面的代码片段中,@Temporal(TemporalType.DATE)
删除时间值并仅保留日期。
@Temporal(TemporalType.DATE)
private java.util.Date creationDate;
根据Javadoc文档,
使用注释在查询方法参数上声明适当的{@code TemporalType}。请注意,此注释仅可用于具有默认
TemporalType.DATE
的{@link Date}类型参数。
[以上信息来自各种来源]
02/10/2017
,想要将其转换为 2017-10-02
或者 2017/10/02
。 - Shantaram Tupe@Temporal
是一个 JPA 注解,可用于将以下列项之一存储在数据库表中:
java.sql.Date
)java.sql.Time
)java.sql.Timestamp
)通常情况下,当我们在类中声明 Date
字段并尝试将其存储时,它会作为 TIMESTAMP 存储在数据库中。
@Temporal
private Date joinedDate;
以上代码将存储类似于08-07-17 04:33:35.870000000 PM的值。
如果我们想要在数据库中仅存储日期,
我们可以使用/定义TemporalType
。
@Temporal(TemporalType.DATE)
private Date joinedDate;
这一次,它会将08-07-17存储在数据库中。
除了@Temporal
之外,还有其他一些属性可以根据需要使用。
时间类型是一组基于时间的类型,可用于持久状态映射。
支持的时间类型列表包括三个java.sql
类型java.sql.Date
,java.sql.Time
和java.sql.Timestamp
,以及两个java.util
类型java.util.Date
和java.util.Calendar
。
java.sql
类型完全无需考虑。它们就像任何其他简单映射类型一样,并不需要任何特殊考虑。
然而,这两个java.util
类型需要额外的元数据来指示与JDBC驱动程序通信时使用哪个JDBC java.sql
类型。这可以通过使用@Temporal
注释并将JDBC类型指定为TemporalType
枚举类型的值来完成。
有三个枚举值DATE、TIME和TIMESTAMP,代表每个java.sql
类型。
如果你只是要一个简短的答案:
在使用java.util.Date时,Java并不知道如何直接关联SQL类型。这就是@Temporal
发挥作用的时候。它被用来指定所需的SQL类型。
来源:Baeldung
我使用的是Hibernate 5.2,@Temporal
不再是必需的。
java.util.date、sql.date和time.LocalDate会以适当的数据类型(Date/timestamp)存储到数据库中。
// 获取当前日期
LocalDate now = LocalDate.now();
// 创建指定日期的对象
LocalDate date = LocalDate.of(2023, 3, 22);
可以使用getYear()、getMonth()和getDayOfMonth()等方法获取日期的各个部分,也可以使用withXXX()方法设置日期的某个部分。例如:int year = date.getYear();
Month month = date.getMonth();
int day = date.getDayOfMonth();
LocalDate newDate = date.withYear(2024).withMonth(4).withDayOfMonth(1);
此外,LocalDate还提供了许多常用的操作,如加减天数、比较日期、格式化日期等。例如:LocalDate tomorrow = today.plusDays(1);
LocalDate yesterday = today.minusDays(1);
int result = today.compareTo(otherDate);
String formattedDate = today.format(DateTimeFormatter.ISO_DATE);
总的来说,Java 8中的LocalDate类提供了方便且易于使用的日期处理功能,适用于许多应用程序。 - Josh@Temporal
是Hibernate JPA注解之一,仅应在java.util.Date或java.util.Calendar上设置。
它有助于将日期和时间值从Java对象转换为兼容的数据库类型,并将其检索回应用程序。
支持;@Temporal(TemporalType.TIMESTAMP)
@Temporal(TemporalType.DATE)
@Temporal(TemporalType.TIME)
使用这个
@Temporal(TemporalType.TIMESTAMP)
@Column(name="create_date")
private Calendar createDate;
public Calendar getCreateDate() {
return createDate;
}
public void setCreateDate(Calendar createDate) {
this.createDate = createDate;
}
@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert both time and date.
@Temporal
。它是用于注释Date
和Calendar
字段的,但这些类设计不佳且已经过时。相反,应该使用来自 java.time, 现代 Java 日期和时间 API 的类。它们内置了预期的精度,并且您不需要使用该注释与它们一起使用。 - Ole V.V.