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

bgu*_*uiz 26 java documentation date jpql

SELECT x FROM SomeClass
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH)
Run Code Online (Sandbox Code Playgroud)

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

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

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

She*_*ari 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();
}
Run Code Online (Sandbox Code Playgroud)

但是,这要求日期有效.

UPDATE

如果你总是想要下个月,你可以使用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();
Run Code Online (Sandbox Code Playgroud)

  • 你试过JodaTime部分吗?JPA可以处理`DateTime`吗? (3认同)

Pas*_*ent 18

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

  • 这仍然是真的吗? (5认同)

Sea*_*oyd 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();
Run Code Online (Sandbox Code Playgroud)

但是我知道这不是您要问的,我很确定不能仅在JPQL中完成它,您要么必须传递参数,要么使用本地命名查询

  • 最好使用Joda-Time,因为它是JSR-310(https://jsr-310.dev.java.net/)的参考实现。 (2认同)
  • 是的,但是在我从事的大多数项目中,commons / lang已经在类路径中了。而且,我不认为上面看到的简单用法可以证明使用joda是合理的(如果没有另外使用的话) (2认同)