Как найти по дате из столбца метки времени в критериях JPA?

Я хочу найти запись по дате. В таблице сущностей и баз данных типом данных является отметка времени. Я использовал базу данных 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)

person Kre Toni    schedule 05.12.2012    source источник
comment
Можете ли вы обновить сообщение с соответствующим кодом и проблемой с ним   -  person Nayan Wadekar    schedule 05.12.2012


Ответы (3)


Тип БД — TIMESTAMP, а не DATE, что означает, что вы сохраняете точное время.

При использовании new GregorianCalendar(2012,12,5).getTime() вы запрашиваете метки времени, которые соответствуют заданной дате в 00:00:00.000 и не существуют в вашей БД.

Вы должны либо изменить БД для хранения дат вместо меток времени, либо изменить свой запрос.

В JPA 2 есть функции ГОД, МЕСЯЦ и ДЕНЬ, так что вы можете

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 и сделайте то же самое для поля даты в БД и сравните их.

person Aviram Segal    schedule 05.12.2012
comment
codeSELECT WHERE YEAR(yourdate) = YEAR(dbdate) AND MONTH(yourdate) = MONTH(dbdate) and DAY(yourdate) = DATE(dbdate) code Как писать с помощью JPA 2.0 Criteria API - person Kre Toni; 06.12.2012

САМЫЙ ПРОСТОЙ СПОСОБ сравнить дату двух дат и времени

сравнить две даты и игнорировать время

ГДЕ ДАТА (dbdDate) = ДАТА (вашаДата)

person H. ELKINA    schedule 14.07.2017

Вы можете использовать собственный запрос в файле jpql.

Пример (SQL-сервер):

select table from table where convert(date,mydate)=:date_colum
person Michel    schedule 10.11.2015