我使用的是Hibernate 4.3.6.Final,它支持JPA 2.1。我需要根据用户输入构建一个复杂的查询。 我完成了剩下的工作,但仍然有这个问题。让我们把元模型或其他解决方案放在一边,看看当前的问题是如何解决的。
以下是类结构及其关系:
class BaseObject implements Serializable {
}
class A extends BaseObject{
@OneToMany(mappedBy = "aref", fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, orphanRemoval = true)
private List<B> blist;
}
class B extends BaseObject {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "aref")
private A aref;
}
//-------------NOTE THAT IS A SUBCLASS OF B------------
class C extends B {
@OneToMany(mappedBy = "cref", fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, orphanRemoval = true)
private List<D> dlist;
}
class D {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cref")
private C cref;
String name;
}
现在我想得到一个列表一个对象,在加入之后,它的值为&#34; name&#34; D级中的字段是&#34; John&#34;。这就是我所拥有的:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<A> root = cq.from(A.class);
CriteriaQuery<Object> select = cq.select(root);
Join bjoin = root.join("blist");
Join cjoin = cb.treat(bjoin, C.class);
Join djoin = cjoin.join("dlist"); //ERROR HAPPENS HERE
Predicate p = cb.equal(djoin.get("name"), "John");
cq.where(p);
Query query = em.createQuery(select);
List<A> result = query.getResultList();
但我一直收到以下错误:
无法在此ManagedType [BaseObject]上找到具有给定名称[dlist]的Attribute
我正在做的是正确的吗?如何解决这个问题?我认为使用treat方法应该有助于在子类上找到属性。
谢谢!