JPA标准:查询子类属性的问题

JPA标准:查询子类属性的问题,jpa,criteria-api,Jpa,Criteria Api,我使用的是Hibernate4.3.6.Final,它支持JPA2.1。我需要根据用户输入构建一个复杂的查询。 我已经完成了剩下的工作,但我仍然有这个问题。让我们把元模型或其他解决方案放在一边,看看如何解决当前的问题 以下是类结构及其关系: class BaseObject implements Serializable { } class A extends BaseObject{ @OneToMany(mappedBy = "aref", fetch = FetchType.LA

我使用的是Hibernate4.3.6.Final,它支持JPA2.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;
}
现在我想得到一个列表a对象,在联接之后,类D中name字段的值是John。以下是我所拥有的:

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]的属性

我现在做的对吗?如何解决这个问题?我认为使用treat方法应该有助于找到子类的属性

谢谢