我有一张这样的桌子:
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 中编写表达式来查找仍然有效的条目(创建日期 + 有效性_天)?
SELECT * FROM MIGRation WHERE DATE_ADD(MIGR_CreationDate, INTERVAL MIGR_Validity_Days DAY) > now()
对于算术查询,请查看
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
我也遇到了同样的问题,我已经通过以下方式解决了。这个想法是比较来自不同实体的两个日期,并将一天添加到前一个日期。
.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}是参数替换的字段切塞。 fcServBaja.
据我了解,模板包含本机数据库操作(我使用Oracle)
希望对你有帮助。