2017-03-17 340 views
0

我放弃了试图找出它,所以我问这里:)我的目标是过滤CriteriaBuilder数据库查询中的一些数据。每个Client具有像howMuchOrdersorderTotalValue的字段。Persistance's CriteriaBuilder - 检查是否大于0

这里我试着检查我给出的atLeastAverageValue是否低于averageTotalValueExpression(通过orderTotalValue除以howMuchOrders计算)。在刚开始时,我需要检查我的atLeastAverageValue是否不为空。否则,我不想使用查询将谓词添加到已执行的谓词列表中。

一切工作正常,直到root.get("orderCount")给零(这是可能的),它会抛出org.springframework.dao.DataIntegrityViolationException。我可以捕捉并处理这个异常,但这不是我喜欢这样做的方式。首先,我想查看root.get("orderCount")中的值是否为空。如果不是 - 计算并添加prediacte到谓词列表。否则什么都不要做

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

找到解决方案!我无法确定该值是否大于0,如if声明中所示,但我想象了SQL查询的外观。我只是需要检查是否orderCount > 0orderValue/order逻辑AND :)看起来是这样的:

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

我只是需要一些时间:)