这是等效 JPA Criteria Query 的解释
SELECT * from run where TIMESTAMPDIFF(SECOND, run.end_time,
运行.start_time) > 60;
首先,您必须创建单位表达式并将其扩展为BasicFunctionExpression
以“SECOND”参数为单位并覆盖其rendor(RenderingContext renderingContext)
仅方法。
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);
这是工作。