JPA Criteria API:数据库中两个日期之间的差异?

fla*_*ost 7 java jpa query-builder

简单问题:我有一个带有两个日期列(从,直到)的(MySQL)表,并询问它

select * from mytable where until > from + interval 4 week;
Run Code Online (Sandbox Code Playgroud)

这在 MySQL 中非常简单。

你怎么能在 JPA Query 中做到这一点

cq.where(cb.and(mytable_.get(until),...)
Run Code Online (Sandbox Code Playgroud)

编辑:两个日期都来自数据库行,我比较了数据库的两个字段,而不是应用程序中的一个字段与数据库中的一个字段。

Kha*_*hah 7

这是等效 JPA 标准查询的解释

select * from mytable where until > from + interval 4 week;

首先,您必须创建单元表达式并从 BasicFunctionExpression 扩展它,其中将“WEEK”参数作为一个单元并仅覆盖其 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在 JPA 条件查询中使用此单元表达式。

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

    Expression<String> week= new UnitExpression(null, String.class, "WEEK");
    Expression<Integer> timeDiff = cb.function(
        "TIMESTAMPDIFF",
        Integer.class,
        week,
        root.<Timestamp>get(MyTable_.until),
        root.<Timestamp>get(MyTable_.from));
    List<Predicate> conditions = new ArrayList<>();
    conditions.add(cb.greaterThan(timeDiff, 4));
    cq.where(conditions.toArray(new Predicate[]{}));
    return session.createQuery(cq);
Run Code Online (Sandbox Code Playgroud)

它工作正常。

  • 您不能只使用“Expression&lt;String&gt; week= cb.literal("WEEK");”,而不是为其创建整个类吗? (2认同)