@Temporal 注解用在类型为 java.util.Date 和 java.util.Calendar 的属性或字段上面,用来指定属性或字段的精度。该注解可以与 @Basic、@Id 或 @ElementCollection 注解一起使用。
@Temporal 注解只有一个 value 属性,该属性接收 TemporalType 枚举类型。TemporalType 枚举支持如下三个可选值:
DATE:映射到 java.sql.Date,只有日期;
TIME:映射到 java.sql.Time,只有时间;
TIMESTAMP:映射到 java.sql.Timestamp,日期+时间;
@Temporal 的用法:
// 映射为日期 date( 只有日期) @Temporal(TemporalType.DATE) // 映射为日期 time( 只有时间) @Temporal(TemporalType.TIME) // 映射为日期 datetime( 日期+时间) @Temporal(TemporalType.TIMESTAMP)
(1)假如我们创建拥有三个日期类型字段的用户表 users3,SQL 脚本如下:
CREATE TABLE `users3` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(255) DEFAULT NULL COMMENT '姓名', `age` int(10) unsigned DEFAULT NULL COMMENT '年龄', `birthday` datetime DEFAULT NULL, `birthday2` datetime DEFAULT NULL, `birthday3` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
(2)创建 users3 数据表对应的 Java 实体,代码如下:
import lombok.Data; import javax.persistence.*; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; @Data @Entity @Table(name = "users3") public class User12 { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column private String name; @Column private Integer age; // 日期 @Column @Temporal(TemporalType.DATE) private Date birthday; // 时间 @Column @Temporal(TemporalType.TIME) private Time birthday2; // 日期 + 时间 @Column @Temporal(TemporalType.TIMESTAMP) private Timestamp birthday3; }
(3)客户端代码,使用 EntityManager 实例查询 User12 实体数据。代码如下:
import com.alibaba.fastjson.JSONObject; import com.huangx.openjpa.annotation.entity.User12; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import java.text.SimpleDateFormat; import java.util.List; public class OpenJpaDemo12 { /** * 持久化单元名称 */ private static final String NAME = "openJPA"; public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory(NAME); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // SELECT String qlString = "select t from User12 t"; Query query = em.createQuery(qlString); List<User12> userList = (List<User12>) query.getResultList(); for (User12 item : userList) { System.out.println(JSONObject.toJSONString(item)); System.out.println("birthday=" + dateFormat.format(item.getBirthday())); System.out.println("birthday2=" + dateFormat.format(item.getBirthday2())); System.out.println("birthday3=" + dateFormat.format(item.getBirthday3())); } em.getTransaction().commit(); em.close(); emf.close(); System.out.println("finished."); } }
运行客户端代码前,现在数据库中添加如下数据:
运行客户端代码,输出结果如下:
{"age":42,"birthday":328723200000,"birthday2":52763000,"birthday3":328804763000,"id":1,"name":"张三丰"} birthday=1980-06-02 00:00:00.000 birthday2=1970-01-01 22:39:23.000 birthday3=1980-06-02 22:39:23.000