【问题标题】:How to find by date from timestamp column in JPA criteria?如何从 JPA 标准中的时间戳列中按日期查找?
【发布时间】:2012-12-05 04:57:43
【问题描述】:

我想按日期查找记录。在实体和数据库表中,数据类型是时间戳。我用的是Oracle数据库。

@Entity
public class Request implements Serializable {
  @Id
  private String id;
  @Version
  private long version;
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "CREATION_DATE")
  private Date creationDate;

  public Request() {
  }

  public Request(String id, Date creationDate) {
    setId(id);
    setCreationDate(creationDate);
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public long getVersion() {
    return version;
  }

  public void setVersion(long version) {
    this.version = version;
  }

  public Date getCreationDate() {
    return creationDate;
  }

  public void setCreationDate(Date creationDate) {
    this.creationDate = creationDate;
  }
}

在勉方法

public static void main(String[] args) {
    RequestTestCase requestTestCase = new RequestTestCase();
    EntityManager em = Persistence.createEntityManagerFactory("Criteria").createEntityManager();

    em.getTransaction().begin();
    em.persist(new Request("005",new Date()));
    em.getTransaction().commit();

    Query q = em.createQuery("SELECT r FROM Request r WHERE r.creationDate = :creationDate",Request.class);
    q.setParameter("creationDate",new GregorianCalendar(2012,12,5).getTime());
    Request r = (Request)q.getSingleResult();
    System.out.println(r.getCreationDate());        

}

在Oracle数据库中的记录是,

ID      CREATION_DATE                   VERSION

006     05-DEC-12 05.34.39.200000 PM    1

例外是,

Exception in thread "main" javax.persistence.NoResultException: getSingleResult() did     not retrieve any entities.
at    org.eclipse.persistence.internal.jpa.EJBQueryImpl.throwNoResultException(EJBQueryImpl.java:1246)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:750)
at com.ktrsn.RequestTestCase.main(RequestTestCase.java:29)

【问题讨论】:

  • 你能用相关代码更新帖子吗?

标签: jpa jpa-2.0 criteria-api


【解决方案1】:

DB 类型是TIMESTAMP 而不是DATE,这意味着您存储的是准确的时间。

使用 new GregorianCalendar(2012,12,5).getTime() 时,您正在查询与 00:00:00.000 的给定日期匹配的时间戳,并且该时间戳在您的数据库中不存在

您应该更改数据库以存储日期而不是时间戳,或者更改您的查询。

JPA 2 具有 YEAR、MONTH 和 DAY 功能,因此您可以

SELECT WHERE YEAR(yourdate) = YEAR(dbdate) AND MONTH(yourdate) = MONTH(dbdate) and DAY(yourdate) = DATE(dbdate)

在 Criteria API 中,您可以执行以下操作:

Expression<Integer> yourdateYear = cb.function("year", Integer.class, yourdate);
Expression<Integer> yourdateMonth = cb.function("month", Integer.class, yourdate);
Expression<Integer> yourdateDay = cb.function("day", Integer.class, yourdate);

然后将它们与 AND 表达式结合起来,对 db 中的日期字段执行相同操作并进行比较。

【讨论】:

  • codeSELECT WHERE YEAR(yourdate) = YEAR(dbdate) AND MONTH(yourdate) = MONTH(dbdate) and DAY(yourdate) = DATE(dbdate) code 如何使用 JPA 编写2.0 标准API
【解决方案2】:

比较两个日期时间的日期的最简单方法

比较两个日期并忽略时间

WHERE DATE(dbdDate) = DATE(yourDate)

【讨论】:

    【解决方案3】:

    您可以在 jpql 中使用本机查询。

    示例(SQL 服务器):

    select table from table where convert(date,mydate)=:date_colum
    

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多