首先,抱歉,如果已经提出这个问题,但我找不到任何类似的问题,也没有找到我的问题的答案。
我的问题是,我在几个层次结构级别中有几个继承自一个子类的子类。
@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
中的属性。
我注意到,无法访问someAttribute
来D
执行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
答案 0 :(得分:1)
这是我一直看到的一个很好的问题。问题是你正在假设有关C的子类型的信息,这是完全正确的。
如果你每班使用一张"表"或"加入表"继承策略,然后D和E的数据存储在单独的表中,select e1 from C eq where someAttribute = .... or anotherAttribute = ....
不起作用,因为这些列不存在于C中。
在进行过滤之前,您需要将D和E中的列左键连接到C上。 (之前我回答了similar question应该有所帮助。