我的物體:
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) 之間的產品,但無法建立標準
我試過(但生成的查詢是錯誤的):
最大-> builder.between(root.get(Product_.PRICES), min, max)
uj5u.com熱心網友回復:
我自己通過使用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);
};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311398.html
