[英]JPA specification join many tables
我有貨架實體、HubProducts 實體、產品實體。
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.