gpt4 book ai didi

java - 使用 CriteriaBuilder 进行动态查询 : one-to-many

转载 作者:行者123 更新时间:2023-12-02 01:37:51 25 4
gpt4 key购买 nike

我想使用 CriteriaBuilder 和 Predicate 构建一个查询,它将返回仅包含具有“图像”的产品的列表。但考虑到产品和图像@OneToMany之间存在关系,我不知道如何实现它。例如,使用 JpaRepository,我知道可以通过以下方式构造此查询: List<Product> findAllByImagesIsNotNull() .

但我需要一个动态查询,所以据我了解,最好使用 CriteriaBuilder。

所以,我有两个实体:

    @Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "product_details_id")
ProductDetails productDetails;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
Category category;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "lens_color_id")
LensColor lensColor;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "frame_color_id")
FrameColor frameColor;

@OneToMany(fetch = FetchType.LAZY,
cascade = CascadeType.ALL,
orphanRemoval = true)
List<Image> images = new ArrayList<>();

@Column(unique = true)
String productNumber;
}

    @Entity
@Table(name = "images")
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;

String imageName;

String imageType;

boolean isMainImage;
}

我有两个元模型:

@StaticMetamodel(Product.class)
public abstract class Product_ {

public static volatile SingularAttribute<Product, LensColor> lensColor;
public static volatile ListAttribute<Product, Image> images;
public static volatile SingularAttribute<Product, FrameColor> frameColor;
public static volatile SingularAttribute<Product, Long> id;
public static volatile SingularAttribute<Product, String> productNumber;
public static volatile SingularAttribute<Product, ProductDetails> productDetails;
public static volatile SingularAttribute<Product, Category> category;

}

@StaticMetamodel(Image.class)
public abstract class Image_ {

public static volatile SingularAttribute<Image, String> imageName;
public static volatile SingularAttribute<Image, Boolean> isMainImage;
public static volatile SingularAttribute<Image, Long> id;
public static volatile SingularAttribute<Image, String> imageType;

}

这是我的查询代码:

    public List<Product> findByCriteria(Integer minPrice, Integer maxPrice, List<LensColor> lensColor, List<FrameColor> frameColor) {
return productDAO.findAll(new Specification<Product>() {
@Override
public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
Join<Product, ProductDetails> productDetailsJoin = root.join(Product_.productDetails, JoinType.INNER);

List<Predicate> predicates = new ArrayList<>();

// MY PREDICATE CODE FOR FIND ALL PRODUCTS WITH IMAGES IS NOT NULL

if (!CollectionUtils.isEmpty(lensColor)) {
predicates.add(criteriaBuilder.and(root.get("lensColor").in(lensColor)));
}
if (!CollectionUtils.isEmpty(frameColor)) {
predicates.add(criteriaBuilder.and(root.get("frameColor").in(frameColor)));
}
if (minPrice != null && maxPrice != null) {
predicates.add(criteriaBuilder.between(productDetailsJoin.get(ProductDetails_.price), minPrice, maxPrice));
}

return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
});
}

最佳答案

对于*对多关系,根据集合类型使用PluralJoin,类型为:

Join<Product, Image> joinImages = root.joinList("images", JoinType.INNER);
predicates.add(cb.isNotNull(joinImages.get(Image_.id)));

关于java - 使用 CriteriaBuilder 进行动态查询 : one-to-many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57508544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com