【发布时间】:2021-06-22 12:25:11
【问题描述】:
我有货架实体、HubProducts 实体、产品实体。
- 货架上有 HubProducts
- 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 + "%"), 不起作用。
有人可以帮忙吗?
【问题讨论】:
-
你能具体说明“不起作用”是什么意思吗?您是否收到错误或与预期不同的结果?
-
@OHGODSPIDERS,我希望应该过滤与产品名称匹配的记录。
标签: java spring-boot hibernate spring-data-jpa specifications