我放弃了试图解决它所以我在这里问:)我的目标是通过CriteriaBuilder过滤数据库查询中的一些数据。每个Client
都有howMuchOrders
和orderTotalValue
等字段。
在这里,我尝试检查我的给定atLeastAverageValue
是否低于averageTotalValueExpression
(通过将orderTotalValue
除以howMuchOrders
计算得出)。在开始时我需要检查我的atLeastAverageValue
是否为空。否则,我不想将谓词添加到带有查询的已执行谓词列表中。
一切正常,直到root.get("orderCount")
给出零(这是可能的)并且它抛出org.springframework.dao.DataIntegrityViolationException
。我可以捕获并处理这个异常,但这不是我喜欢的方式。首先,我想检查root.get("orderCount")
中的值是否为空。如果不是 - 计算并将谓词添加到谓词列表中。否则什么都不做。
private void addMaxAveragePredicate(BigDecimal atLeastAverageValue, List<Predicate> predicates, CriteriaBuilder builder, Root<?> root) {
if (atLeastAverageValue!=null) {
Expression averageTotalValueExpression = builder.quot(root.get("orderCount"), root.get("orderTotalValue")).as(BigDecimal.class);
predicates.add(builder.lessThanOrEqualTo(averageTotalValueExpression, atLeastAverageValue));
}
}
有人可以帮忙吗?
答案 0 :(得分:2)
找到解决方案!我无法像在if
语句中那样找出值是否大于0,但我想象了sql查询的外观。我只需要检查逻辑orderCount > 0
:)中的orderValue/order
和AND
是否如下所示:
predicates.add(builder.and(builder.greaterThan(root.get("orderCount"), 0),
builder.lessThanOrEqualTo(exQuot, attValue)));
我只需要一些时间:)