30
SELECT x FROM SomeClass
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH)

在上面的 JPQL 语句中, SomeClass 有一个 memebr dateAttr,它是 ajava.util.Date并且有一个@Temporal(javax.persistence.TemporalType.DATE)注解。

我需要一种方法来做这(CURRENT_DATE + 1 MONTH)件事-在当前状态下显然是错误的-但找不到带有 JPQL 日期函数的文档。

任何人都可以向我指出记录 JPQL 日期函数(以及如何执行此特定查询)的文档的方向吗?

4

4 回答 4

22

标准 JPQL 不支持此类日期操作。您将不得不使用本机查询或在 Java 端进行计算。

于 2010-05-18T12:33:04.003 回答
18

如果您已经有一个 + 1 个月的日期对象,您可以执行以下操作:

public List findEmployees(Date endDate) {
  return entityManager.createQuery(
    "SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2")
    .setParameter(1,new Date(), TemporalType.DATE)
    .setParameter(2,endDate, TemporalType.DATE).getResultList();
}

但是,这要求日期事先有效。

更新

如果你总是想要下个月,你可以使用JodaTime,它有一个很棒且简单的 api。然后,您可以像这样修改您的查询:

//Get next month
DateTime dt = new DateTime();
entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2")
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,dt.plusMonths(1).toDate(), TemporalType.DATE).getResultList();
于 2010-05-18T11:24:39.597 回答
5

或者使用 commons-lang 代替 jodatime:

entityManager.createQuery(
    "SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2"
)
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,DateUtils.addMonths(new Date(), 1), TemporalType.DATE)
.getResultList();

但我知道这不是你要问的,而且我很确定它不能单独在 JPQL 中完成,你要么必须传递参数,要么使用本机命名查询

于 2010-05-18T11:54:35.020 回答
-1

亲爱的,

我正在使用弹簧数据,实体将 createdDate 保存为日期时间,并在存储库中像这样:

@Query(value="SELECT t FROM MyEntity t WHERE t.createdDate Between ?1 and ?2")
public List<MyEntity> findAllBetweenDates(Calendar from, Calendar to);

所以我不能使用:

setParameter(1,new Date(), TemporalType.DATE

在后端 bean 中,我使用以下内容:

    //to set zero of hours,minutes,seconds and milliseconds
    fromCalendar.set(java.util.Calendar.HOUR, 0);
    fromCalendar.set(java.util.Calendar.MINUTE, 0);
    fromCalendar.set(java.util.Calendar.SECOND, 0);
    fromCalendar.set(java.util.Calendar.MILLISECOND, 0);

    toCalendar.set(java.util.Calendar.HOUR, 0);
    toCalendar.set(java.util.Calendar.MINUTE, 0);
    toCalendar.set(java.util.Calendar.SECOND, 0);
    toCalendar.set(java.util.Calendar.MILLISECOND, 0);
    // add 1 days and decrease 1 millisecond
    toCalendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
    toCalendar.add(java.util.Calendar.MILLISECOND, -1);

    allEntities = myEntityRepository.findAllBetweenDates(fromCalendar, toCalendar);
}

它工作正常。

于 2016-01-24T06:26:32.323 回答