Persistance's CriteriaBuilder - 检查是否大于0

时间:2017-03-17 17:54:31

标签: java spring hibernate criteria

我放弃了试图解决它所以我在这里问:)我的目标是通过CriteriaBuilder过滤数据库查询中的一些数据。每个Client都有howMuchOrdersorderTotalValue等字段。

在这里,我尝试检查我的给定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));

    }
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

找到解决方案!我无法像在if语句中那样找出值是否大于0,但我想象了sql查询的外观。我只需要检查逻辑orderCount > 0 :)中的orderValue/orderAND是否如下所示:

predicates.add(builder.and(builder.greaterThan(root.get("orderCount"), 0), 
builder.lessThanOrEqualTo(exQuot, attValue)));

我只需要一些时间:)