QueryDSL日期运算

3

我有一张这样的表:

CREATE  TABLE IF NOT EXISTS `sma`.`MIGRation` (
`MIGR_ID` BIGINT NOT NULL AUTO_INCREMENT ,
`MIGR_From` VARCHAR(1024) NOT NULL ,
`MIGR_To` VARCHAR(1024) NOT NULL ,
`MIGR_Validity_Days` INT NOT NULL ,
`MIGR_CreationDate` DATETIME NOT NULL ,
PRIMARY KEY (`MIGR_ID`) );

你如何在QueryDSL中编写表达式以查找仍然有效的条目(creationDate + validity_Days)?
SELECT * FROM MIGRation WHERE DATE_ADD(MIGR_CreationDate, INTERVAL MIGR_Validity_Days DAY) > now()
2个回答

8

针对算术查询,请查看com.querydsl.core.types.dsl.Expressions类。在这种情况下,可以使用Expressions::dateTimeOperation

import com.querydsl.core.types.Ops;
import com.querydsl.core.types.dsl.*;
import com.querydsl.sql.SQLQuery;
...
    @Transactional
    public List<MIGRationEntity> getMigration() {
        SQLQuery<MIGRationEntity> query = selectFrom(QMIGRation.MIGRation)
            .where(
                Expressions.dateTimeOperation(
                    Date.class, Ops.DateTimeOps.ADD_DAYS,
                    QMIGRation.MIGRation.mIGRCreationDate,
                    QMIGRation.MIGRation.mIGRValidityDays)
                .gt(DateTimeExpression.currentTimestamp()));
        String sql = query.getSQL().getSQL();
        System.out.print(sql);
        return query.fetch();
    }
...

生成的SQL语句:

select MIGRation.MIGR_CreationDate, MIGRation.MIGR_From, MIGRation.MIGR_ID, MIGRation.MIGR_To, MIGRation.MIGR_Validity_Days
from MIGRation MIGRation
where date_add(MIGRation.MIGR_CreationDate, interval MIGRation.MIGR_Validity_Days day) > current_timestamp

我正在使用这段完全相同的代码,但是在结果查询中我没有得到 date_add 函数。相反,它有一个名为 schema_name.add_minutes 的函数,但由于不存在这样的函数,因此失败了。 - Kapil Malhotra

0
我遇到了同样的问题,并且我已经用以下方法解决了它。思路是比较来自不同实体的两个日期,并在前一个日期上加一天。
".or(cese.fcServBaja.isNotNull().and(Expressions.dateTemplate(LocalDate.class, "{0} + 1", cese.fcServBaja).eq(ptDiasPermiso.compId.fcInicio)))"
"Expressions.dateTemplate(LocalDate.class, "{0} + 1", cese.fcServBaja)" 表示我想要的数据类型,第二个是SQL表达式,其中的"{0}"是由参数 cese.fcServBaja 替换的字段。
据我理解,模板包含了本地数据库操作(我使用的是Oracle)。
希望对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接