这是等效的JPA标准查询的说明
SELECt * from TIMESTAMPDIFF(SECOND,run.end_time,run.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);这是工作。



