JPA2 Criteria Builder - 对抽象类和多个子类的查询

时间:2012-02-07 10:33:23

标签: jpa-2.0 criteria subclass hierarchy builder

首先,抱歉,如果已经提出这个问题,但我找不到任何类似的问题,也没有找到我的问题的答案。

我的问题是,我在几个层次结构级别中有几个继承自一个子类的子类。



    @Entity
    public class A{ }

    @Entity
    public class B extends A { ... }

    @Entity
    public class C extends A{ ... }

    @Entity 
    public class D extends C { 
        private String someAttribute; 
    }

    @Entity 
    public class E extends C { 
        private String anotherAttribute; 
    }

我需要在C上处理查询,并根据我的条件从C,D,E获取所有实体,该条件访问D and E中的属性。

我注意到,无法访问someAttributeD执行C上的查询 Root root = query.from(C.class); Path p = root.get("someAttribute"); Path p2 = root.get("anotherAttribute"); 。像这样:

`select e1 from C eq where someAttribute = .... or anotherAttribute = ....`

请注意,此时我无法使用元模型。

在JPAQL中,我会编写类似的东西:

@XmlSeeAlso

它会正确地解决我的层次结构。

为了解决这个问题,我创建了自己的注释,等同于@PersistenceSeeAlso并命名为@PersistenceSeeAlso,它告诉我,我必须查找哪些子类才能找到我的属性。因此,当我按照Root处理我的层次结构并获取我的路径时,我需要为每个子类创建一个新的query.form(clazz)元素,以便查找我的属性。

这里的主要问题是,Root在查询上创建了一个连接,这完全弄乱了我的查询,但我需要在我的类型上使用Root元素来解析路径。

所以我的问题是;有没有办法,用JPA2 CriteriaBuilder处理多个子类选择而不创建新的{{1}}实例,可能有EntityType?

或者我做错了什么?

非常感谢你!

祝你好运, Q

1 个答案:

答案 0 :(得分:1)

抱歉漫长的等待!

这是我一直看到的一个很好的问题。问题是你正在假设有关C的子类型的信息,这是完全正确的。

如果你每班使用一张"表"或"加入表"继承策略,然后D和E的数据存储在单独的表中,select e1 from C eq where someAttribute = .... or anotherAttribute = ....不起作用,因为这些列不存在于C中。

在进行过滤之前,您需要将D和E中的列左键连接到C上。 (之前我回答了similar question应该有所帮助。