gpt4 book ai didi

jpa - 如何从 JPA 条件中的时间戳列按日期查找?

转载 作者:行者123 更新时间:2023-12-01 11:48:28 26 4
gpt4 key购买 nike

我想按日期查找记录。在实体和数据库表中,数据类型是时间戳。我使用的是 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)是,

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)

最佳答案

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

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

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

JPA 2 有 YEAR、MONTH 和 DAY 函数,因此您可以

选择 YEAR(yourdate) = YEAR(dbdate) 和 MONTH(yourdate) = MONTH(dbdate) 和 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中的日期字段做同样的操作并进行比较。

关于jpa - 如何从 JPA 条件中的时间戳列按日期查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13716586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com