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日期函数(以及如何执行此特定查询)吗?
答案 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);
}
它工作正常。