我想按日期查找记录。在实体和数据库表中,数据类型是时间戳。我使用的是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;
}
}
以mian方法
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)
答案 0 :(得分:4)
数据库类型为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中的日期字段执行相同操作并比较它们。
答案 1 :(得分:1)
比较两个日期时间的最简单方法
比较两个日期并忽略时间
WHATE DATE(dbdDate)= DATE(yourDate)
答案 2 :(得分:0)
您可以在jpql中使用本机查询。
示例(SQL服务器):
select table from table where convert(date,mydate)=:date_colum