jpa-2.0 – JPA2 Criteria 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和E访问属性. 我注意到,不可能访问例如someAttribute来自D执行C上的查询,如下所示: 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? 或者我做错了什么? 非常感谢你提前! 最好的祝福, 解决方法
抱歉漫长的等待!
这是我一直看到的一个很好的问题.问题是您正在假设有关C的子类型的信息,这不完全正确. 如果使用“每类表”或“连接表”继承策略,则D和E的数据存储在单独的表中,并从C eq中选择e1,其中someAttribute = ….或anotherAttribute = ….不起作用,因为C中不存在这些列. 在过滤之前,您需要将D和E中的列左键连接到C上. (之前我回答了similar question应该有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |