JPA CriteriaBuilder日期操作

时间:2014-01-27 10:37:48

标签: java sql postgresql jpa

我正在尝试将我的sql查询转换为JPA Criteria Builder,这是我正在处理的项目中使用的,我坚持使用日期操作(PostgreSQL 9.3),我在where子句中有一点:

...AND cl.due_date + '3 YEARS' <= '2016-01-01 10:27:16.473' and cl.due_date + '3 YEARS' >= '2008-01-01 10:27:16.473'....

问题是我无法为“due_date”+“3年”创建Predicate对象。 有谁知道如何设法做到这一点?

提前致谢

1 个答案:

答案 0 :(得分:2)

您需要在Java中添加(或减去)3年,而不是在查询中添加(或减去):

Calendar dueDateCalPlus3Years = Calendar.getInstance();
dueDateCalPlus3Years.set(set(year, month, date, hourOfDay, minute, second);
dueDateCalPlus3Years.add(Calendar.YEAR, -3);
Date dueDatePlus3Years = dueDateCalPlus3Years.getTime();

Expression<Date> cl;      // initialize it!
Predicate predicate = criteriaBuilder.greaterThanOrEqualTo(cl, dueDatePlus3Years);

为了更简洁,您可以使用区间映射CriteriaBuilder#between(),并且您发布的查询会产生以下结果:

Date date1;
Date date2;

Predicate predicate = criteriaBuilder.not(criteriaBuilder.between(cl, date1, date2));