【发布时间】:2012-02-28 18:53:14
【问题描述】:
首先,很抱歉,如果这个问题已经被问过,但我找不到任何类似的问题或我的问题的答案。
我的问题是,我有几个继承自一个子类的层次结构级别的子类。
@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 访问属性。
我注意到,在 C 上执行查询时,无法访问例如 someAttribute 和 D。像这样:
Root root = query.from(C.class);
Path p = root.get("someAttribute");
Path p2 = root.get("anotherAttribute");
请注意,我目前无法使用元模型。
在 JPAQL 中,我会编写类似的代码:
`select e1 from C eq where someAttribute = .... or anotherAttribute = ....`
它会正确地解决我的层次结构。
为了解决这个问题,我创建了自己的注释,等效于@XmlSeeAlso,并将其命名为@PersistenceSeeAlso,它告诉我必须查找哪些子类才能找到我的属性。因此,当我根据@PersistenceSeeAlso 处理我的层次结构并获取我的路径时,我需要为每个子类创建一个新的Root 元素,以便查找我的属性。
这里的主要问题是,query.form(clazz) 在查询上创建了一个连接,这完全弄乱了我的查询,但我需要在我的类型上添加一个 Root 元素来解析路径。
所以我的问题是;有没有办法使用 JPA2 CriteriaBuilder 处理多个子类选择,而无需创建新的 Root 实例,也许使用 EntityType?
还是我做错了什么?
非常感谢您!
最好的问候, 问
【问题讨论】:
标签: jpa-2.0 criteria subclass hierarchy builder