JPA Criteria:查询子类属性的问题

时间:2014-09-10 14:25:04

标签: jpa criteria-api

我使用的是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方法应该有助于在子类上找到属性。

谢谢!

0 个答案:

没有答案