【发布时间】:2021-09-10 05:00:58
【问题描述】:
我想构建一个Specification 来过滤不直接包含在实体中但在“第二次连接”中的属性。
实体看起来(非常简化)如下:
@Entity
public class A {
@Id
private UUID id;
@OneToMany(mappedBy=pk.a)
private List<B> b;
}
@Entity
public class B {
@EmbeddedId
private PK pk;
}
@Embeddable
public class PK {
@ManyToOne
private A a;
@ManyToOne
private C c;
}
@Entity
public class C {
@Id
private UUID id;
@OneToMany(mappedBy=pk.b)
private List<B> b;
}
我想获取所有具有特定 C.id 的 A,并且我已经有一个按名称工作的存储库方法:
List<A> findAllByBPKCId(String id);
由于我需要更多过滤器,因此我需要移至 JpaSpecificationExecutor,但我无法构建 Specification 以执行与以前的存储库方法相同的操作。
到目前为止,我尝试的是: 调用
List<A> findAll(Specification specification);
与
new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteraBuilder) {
return criteriaBuilder.equal(root.join("b").join(pk.c).get("id"), ID_TO_COMPARE);
}
}
但是它不会找到“pk.c”,我需要在加入 c 之前先以某种方式“获取”pk。它会引发 IllegalArgumentException,因为它“无法找到具有给定名称 [pk.b] 的属性”。
如何加入嵌套在嵌入式“复合主键”中的实体?
【问题讨论】:
标签: java hibernate jpa repository hibernate-criteria