簡體   English   中英

JPA規范連接多表

[英]JPA specification join many tables

我有貨架實體、HubProducts 實體、產品實體。

  1. 貨架有 HubProducts
  2. HubProducts 有產品
  3. 產品有名稱
public class Shelf extends BaseEntity {
    
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "hub_product_id")
    private Set<HubProducts> hubProducts;
}

public class HubProducts extends BaseEntity {
    
    @JsonBackReference
    @JoinColumn(name = "products_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Products product;
}

同樣,產品實體具有名稱字段。

現在我想使用 JPA 規范進行查詢,以便過濾與產品名稱匹配的所有記錄

為此,我寫了:

private static void applyKeywordFilter(CriteriaBuilder cb,
                                       Root<Shelf> root,
                                       Collection<Predicate> predicates,
                                       String keyword) {
    if (!ObjectUtils.isEmpty(keyword)) {
        predicates.add(cb.or(
            // Shelf->hubProducts->Products -> [name]
            cb.like(root.join("hubProducts", JoinType.LEFT).join("product",  JoinType.LEFT).get("name"), "%" + keyword + "%"),
            cb.like(root.get("shelfDetails"), "%" + keyword + "%")));
    }
}

但不幸的是cb.like(root.join("hubProducts", JoinType.LEFT).join("product", JoinType.LEFT).get("name"), "%" + keyword + "%"),沒有工作。

有人可以幫忙嗎?

在我的情況下,我必須實體 Producers、Movie、Actor。 電影有多名演員和一名制片人。 為了執行搜索,我使用了這個:

private Specification<Movie> searchSpecification(String keyword) {
        return ((root, criteriaQuery, criteriaBuilder) -> {
            criteriaQuery.distinct(true);
            if ((keyword ==null)) {
                return null;
            }
            return criteriaBuilder.or(
                    criteriaBuilder.like(root.get("name"), "%" + keyword + "%"),
                    criteriaBuilder.like(root.get("plot"), "%" + keyword + "%"),
                    criteriaBuilder.like(root.join("actors").get("name"), "%" + keyword + "%"),
                    criteriaBuilder.like(root.join("producer").get("name"), "%" + keyword + "%")
            );
        });
    }

你參考這個來生成你自己的規范和連接表。 在這里,我加入了 3 張桌子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM