【发布时间】:2019-01-17 03:22:10
【问题描述】:
我正在尝试使用 JPA Criteria API 过滤特定范围之间的日期。
问题是我的实体中没有直接的日期,我使用日期字段获取日期并将天数(在另一个字段中)添加到该日期。
我环顾四周,看到一些建议在将日期传递给标准生成器之前在 java 中计算日期,但问题是我不知道要添加的天数,因为它取决于表格的特定列。
简化表 OBJECT 有一个日期类型的字段 CREATION_DATE 和一个数字的 EXPIRATION_DAYS。我想按一个可能的过期日期范围进行过滤,我得到 OBJECT 表中每个元素的过期日期,将 EXPIRATION_DAYS 添加到 CREATION_DATE,SQL 查询是:
select * from OBJECT
where CREATION_DATE + EXPIRATION_DAYS
between to_date('01/01/2018','dd/MM/yyyy') and to_date('01/02/2018','dd/MM/yyyy')
在CriteriaBuilder 我做了一些尝试,但我认为我尝试使用的最佳方法如下:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object> criteria = criteriaBuilder.createQuery(Object.class);
List<Predicate> predicates...
predicates.add(criteriaBuilder.between(
criteriaBuilder.function("AddDate", Date.class, Object.get("creationDate"), criteriaBuilder.literal("day"), Object.get("expirationDays")),
dateInit, dateEnd));
criteria.where(predicates.toArray(new Predicate[]{}));
...
TypedQuery<Object> query = entityManager.createQuery(criteria);
return query.getResultList();
我使用function("addDate"...) 方法,问题是我认为 JPA 实现将“addDate”翻译为特定的数据库供应商,但事实并非如此,因为它抛出了以下非常清楚的异常:
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: "ADDDATE": invalid identifier
以及查询跟踪:
(AddDate(t0.CREATION_DATE, ?, t0.EXPIRATION_DAYS) BETWEEN ? AND ?)).
如何使用 ORACLE 作为数据库来实现这一点?还是有更好的方法?
【问题讨论】:
-
function直接通过,因为它正在调用显式 SQL 函数。 -
@BillyFrost 起初阅读了一些文档我虽然有一些使用
function的名称函数将被转换为特定的供应商函数......但是你对function的方式是正确的,谢谢:)
标签: oracle jpa oracle10g criteria-api