gpt4 book ai didi

java - JPA CriteriaQuery 计算用于 where 谓词的日期时间差

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

我正在尝试从数据库中选择两个字段之间的时间差小于或大于某个值的实体。在标准 SQL 中,这可以使用 TIMESTAMPDIFF 函数简单地完成:

SELECT * from run where TIMESTAMPDIFF(SECOND, run.end_time, run.start_time) > 60;

但是,JPA 2.0 中似乎没有任何等效项。

我已经尝试了我能想到的一切,包括这里的建议:Using TIMESTAMPDIFF with JPA criteria query and hibernate as the provider

predicate.getExpressions().add(criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.function("TIMESTAMPDIFF", Long.class, criteriaBuilder.literal("SECOND"), root.get(Run_.endTime), root.get(Run_.startTime)), minSeconds))

根本不起作用,因为我专门尝试计算较长的持续时间(60/90 天)。 TIMEDIFF 解决方案没有帮助,因为可以返回的最大 TIMEDIFF 是 35 天。还有其他方法可以实现这一点吗?

最佳答案

这里是等效 JPA Criteria Query 的说明

SELECT * from run where TIMESTAMPDIFF(SECOND, run.end_time, run.start_time) > 60;

首先,您必须创建单元表达式并从 BasicFunctionExpression 扩展它,该表达式将“SECOND”参数作为单元并仅重写其 rendor(RenderingContextRenderingContext) 方法。

import java.io.Serializable;
import org.hibernate.query.criteria.internal.CriteriaBuilderImpl;
import org.hibernate.query.criteria.internal.compile.RenderingContext;
import org.hibernate.query.criteria.internal.expression.function.BasicFunctionExpression;

public class UnitExpression extends BasicFunctionExpression<String> implements Serializable {

public UnitExpression(CriteriaBuilderImpl criteriaBuilder, Class<String> javaType,
String functionName) {
super(criteriaBuilder, javaType, functionName);
}

@Override
public String render(RenderingContext renderingContext) {
return getFunctionName();
}
}

然后您在 JPA 标准查询中使用此单位表达式。

    CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Run> cq = cb.createQuery(Run.class);
Root<Run> root = cq.from(Run.class);

Expression<String> second = new UnitExpression(null, String.class, "SECOND");
Expression<Integer> timeDiff = cb.function(
"TIMESTAMPDIFF",
Integer.class,
second,
root.<Timestamp>get(Run_.endTime),
root.<Timestamp>get(Run_.startTime));
List<Predicate> conditions = new ArrayList<>();
conditions.add(cb.greaterThan(timeDiff, 60));
cq.where(conditions.toArray(new Predicate[]{}));
return session.createQuery(cq);

它正在工作。

关于java - JPA CriteriaQuery 计算用于 where 谓词的日期时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32659963/

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