gpt4 book ai didi

oracle - JPA Criteria API - 使用 ORACLE 将天数添加到 DATE

转载 作者:行者123 更新时间:2023-12-02 09:51:04 24 4
gpt4 key购买 nike

我正在尝试使用 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 作为数据库来实现此目的?或者有更好的方法吗?

最佳答案

Hibernate中似乎有@Formula注释提供了我正在寻找的功能,但是在JPA中没有这样的东西,在我的具体实现中也没有这样的东西正在使用(eclipselink)。

我想避免声明特定函数的必要性,但不幸的是我这样做,首先我在Oracle中声明函数ADD_DAYS如下:

create or replace function ADD_DAYS(dateValue DATE, daysValue NUMBER)
return DATE is
begin
return dateValue + daysValue;
end;

然后我使用 function 调用这个函数CriteriaBuilder 的方法,并将函数名称、oracle 函数返回的对象类型以及我定义的两个参数(包含日期的列和包含要添加的天数的列)作为参数传递:

criteriaBuilder.function("ADD_DAYS", Date.class, Object.get("creationDate"), Object.get("expirationDays"))

关于oracle - JPA Criteria API - 使用 ORACLE 将天数添加到 DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51770769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com