首页 > 解决方案 > 使用 CriteriaQuery 调用 oracle 方法 add_months

问题描述

我有一个查询,我想使用CriteriaQuery.

询问:

select * from MY_TABLE where updated_at <= add_months(TRUNC(SYSDATE) + 1, -3)

它基本上是在表中查找update_at日期早于 3 个月的所有记录。

我尝试了此博客中介绍的方法。

问题是我-3作为参数,但我预期的返回类型是Date.

代码:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(MyTable.class);
Root<MyTable> root = cq.from(MyTable.class);
Expression<Date> truncExpr = cb.function("TRUNC", Date.class, cb.currentTimestamp());
Expression<Date> addMonthsExpr = cb.function("add_months", Date.class, truncExpr, months); // <----Compilation error.
Predicate datePredicate = cb.lessThanOrEqualTo(root.get("updated_at"), addMonthsExpr);

请建议。

标签: javaspringhibernatejpacriteria

解决方案


变量的定义months没有显示,但我的猜测是它是一个整数,例如:

int months = -3; // or from a method argument of type int anyway

正确的方法如下(不直观,除非您知道):

Expression<Integer> months = cb.literal(-3);

推荐阅读