【问题标题】:get value from count() in Criteria Api从 Criteria Api 中的 count() 获取值
【发布时间】: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


    【解决方案1】:

    您需要使用 cb 创建一个 nullif 测试。 CriteriaBuilder.nullif​(Expression&lt;Y&gt; x, Y y)

    Long v = cb.nullif​(cb.count(toBigDecimalProductReviewRating(cb, joinProductReview)), L0); //This will be null if count is 0
    
    if (v==null){
          ** do something
        }
    

    来自https://docs.jboss.org/hibernate/jpa/2.2/api/index.html?javax/persistence/criteria/class-use/Expression.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-22
      • 2011-09-20
      • 2016-01-24
      • 2019-04-20
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多