hibernate - JPA 规范将 sum 与 Join 结合使用
问题描述
我有一个名为 Unit 的实体,另一个名为 PriceElement
在哪里
@Entity
public class Unit {
//
@OneToMany(mappedBy = "unit", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<PriceElement> priceElements;
}
@Entity
public class PriceElement {
//
private Integer total;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "unit_Id")
private Unit unit;
}
我想过滤特定范围之间的 priceElements 总属性总和的单位
解决方案
您可以尝试使用子查询进行过滤,如下所示:
//Initialize criteriaBuider and CriteriaQuery
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Unit> cq = cb.createQuery(Unit.class);
//Define Query
Root<Unit> rootUnit = cq.from(Unit.class);
//Create Subquery to get the sum
Subquery<Integer> sqSum = cq.subquery(Integer.class);
Root<PriceElement> rootSQPrice = sqSum .from(PriceElement.class);
Join<PriceElement,Unit> joinSQUnit = rootSQPrice.join(PriceElement_.unit);
//Set the condition, the unit of the subquery is the same as the unit of the main query
sqSum.where(cb.equals(joinSQUnit.get(Unit_.id),rootUnit .get(Unit_.id)))
//Set te result of the subquery as sum of totals
sqSum.select(cb.sum(rootSQPrice.get(PriceElement_.total)));
//Add the result of the subquery in query where clause
cq.where(cb.between(sqSum,Range0,Range1));
cq.select(rootUnit);
另一种选择(仅在 JPA 2.1 中是在内连接子句中添加子查询的条件)
Root<Unit> rootUnit = cq.from(Unit.class);
Join<Unit,PriceElement> joinPrice = rootUnit.join(Unit_.priceElements);
//Id condition is implicit in the initialization of the join, add between condition
joinPrice.on(cb.and(cb.between(sqSum,Range0,Range1)))
推荐阅读
- c - 如何通过引用传递动态结构以更改其大小并插入其中?
- generics - 如何从函数中返回一流模块嵌套类型的实例?
- java - 安排任务在特定时间发生(在 Java 中)
- git - 在我的本地仓库副本上运行 git reset --hard 时的奇怪行为
- java - 如何修复 Androidx 中的渲染问题,导致堆栈跟踪和空白布局预览中出现空指针异常?
- java - 应用程序语言更改默认为原始语言
- azure - 如何轻松锁定对 Azure 资源的访问?
- flutter - TextFormField 内的文本未与中心对齐 - Flutter
- material-ui - Material UI Picker:在焦点上打开 KeyboardDatePicker
- typescript - 为什么在这种情况下不能从参数推断出通用值 N?