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)
编辑:两个日期都来自数据库行,我比较了数据库的两个字段,而不是应用程序中的一个字段与数据库中的一个字段。
这是等效 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)
它工作正常。
| 归档时间: |
|
| 查看次数: |
6757 次 |
| 最近记录: |