@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