【发布时间】:2020-11-07 01:57:58
【问题描述】:
谁能帮我找到解决办法。 我想检查count方法是否等于0。
private Expression<Long> countProductReviewRatings(CriteriaBuilder cb, Join<Product, ProductReview> joinProductReview) {
return cb.count(toBigDecimalProductReviewRating(cb, joinProductReview));
}
这是我要运行的代码示例
这是它使用的方法
private Expression<BigDecimal> toBigDecimalProductReviewRating(CriteriaBuilder cb, Join<Product, ProductReview> joinProductReview) {
return cb.selectCase()
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.FIVE), Rating.FIVE.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.FOUR_AND_HALF), Rating.FOUR_AND_HALF.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.FOUR), Rating.FOUR.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.THREE_AND_HALF), Rating.THREE_AND_HALF.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.THREE), Rating.THREE.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.TWO_AND_HALF), Rating.TWO_AND_HALF.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.TWO), Rating.TWO.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.ONE_AND_HALF), Rating.ONE_AND_HALF.getNumericValue())
.when(cb.equal(joinProductReview.get(ProductReview_.RATING), Rating.ONE), Rating.ONE.getNumericValue())
.otherwise(0)
.as(BigDecimal.class);
这是另一种方法
private Expression<Long> countProductDefaultRatings(CriteriaBuilder cb, Join<Product, ProductDefaultRating> joinProductDefaultRating) {
return cb.count(joinProductDefaultRating.get(ProductDefaultRating_.DEFAULT_AVG_RATING));
}
我在这里运行这个方法
private Expression<Double> calculateAverageRating(CriteriaBuilder cb, Join<Product, ProductReview> joinProductReview,
Join<Product, ProductDefaultRating> joinProductDefaultRating) {
var countProductReviewRatings = countProductReviewRatings(cb, joinProductReview);
var countProductDefaultRatings = countProductDefaultRatings(cb, joinProductDefaultRating);
if (countProductReviewRatings.isNotNull().isNegated() &&
countProductDefaultRatings.isNull().isNegated()) {
return cb.quot(cb.sum(toBigDecimalProductReviewRating(cb, joinProductReview)), countProductReviewRatings).as(Double.class);
}
if (countProductReviewRatings.isNull().isNegated() &&
countProductDefaultRatings.isNotNull().isNegated()) {
return cb.quot(cb.sum(joinProductDefaultRating.get(ProductDefaultRating_.DEFAULT_AVG_RATING)), countProductDefaultRatings).as(Double.class);
}
if (countProductReviewRatings.isNotNull().isNegated() &&
countProductDefaultRatings.isNotNull().isNegated()) {
return cb.quot(cb.sum(cb.quot(cb.sum(toBigDecimalProductReviewRating(cb, joinProductReview)), countProductReviewRatings),
cb.quot(cb.sum(joinProductDefaultRating.get(ProductDefaultRating_.DEFAULT_AVG_RATING)), countProductDefaultRatings)), 2).as(Double.class);
}
CriteriaBuilder.Coalesce<Object> coalesce = cb.coalesce();
coalesce.value(countProductReviewRatings);
coalesce.value(countProductDefaultRatings);
coalesce.value(0);
return coalesce.as(Double.class);
}
主要目的是计算取决于他们是否存在的平均评分,并按此平均评分排序
【问题讨论】:
标签: java spring hibernate jpql criteria-api