【问题标题】:Build specification (Criteria API)构建规范(标准 API)
【发布时间】:2021-10-02 14:19:31
【问题描述】:

我的实体:

public class Product extends BaseEntity {
    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
    List<Price> prices;
}

public class Price extends BaseEntity {

    BigDecimal price;

    @ManyToOne(fetch = FetchType.LAZY)
    Product product;
}

我的搜索条件:

public class ProductSearchCriteria {

    private Optional<BigDecimal> minP;
    private Optional<BigDecimal> maxP;
}

我的规范:

    public static Specification<Product> priceBetween(Optional<BigDecimal> minP, Optional<BigDecimal> maxP) {
    return (root, query, builder) -> {
        //Subquery<Product> sq = query.subquery(Product.class);
        //CriteriaQuery<Price> priceCriteriaQuery = builder.createQuery(Price.class);
        //Root<Price> priceRoot = sq.from(Price.class);

        return minP.map(min -> {
            return maxP.map(max ->
                    //builder
                    ).orElse(null);
        }).orElse(null);
    };
}

在我的规范中,我试图检索价格介于 (price1, price2) 之间的产品,但无法建立标准

我试过了(但生成的查询是假的):

max-> builder.between(root.get(Product_.PRICES), min, max)

【问题讨论】:

    标签: hibernate spring-data-jpa criteria-api


    【解决方案1】:

    我自己通过Join解决了这个问题:

     Join<Product, Price> productPriceJoin = root.join(Product_.PRICES, JoinType.LEFT);
    
    max -> builder.between(productPriceJoin.get(Price_.PRICE), min, max))
    

    完整的解决方案如下所示:

    public static Specification<Product> priceBetween(Optional<BigDecimal> minP, Optional<BigDecimal> maxP) {
            return (root, query, builder) -> {
                Join<Product, Price> productPriceJoin = root.join(Product_.PRICES, JoinType.LEFT);
                return minP.map(min -> {
                    return maxP.map(max ->
                            builder.between(productPriceJoin.get(Price_.PRICE), min, max))
                            .orElse(null);
                }).orElse(null);
            };
        }
    

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2013-06-10
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多