Java:JPQL日期函数,用于将时间段添加到另一个日期

时间:2010-05-18 10:37:11

标签: java date documentation jpql

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

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

我需要一种方法来执行(CURRENT_DATE + 1 MONTH)位 - 它在当前状态下显然是错误的 - 但找不到带有JPQL日期函数的doc。

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

4 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:17)

如果您的日期对象已经是+ 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();

答案 2 :(得分: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,你要么必须传递一个参数,要么使用原生的命名查询

答案 3 :(得分:-1)

逗人,

我使用spring数据,实体将createdDate保存为datetime,并在存储库中保存:

@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);
}

它工作正常。