加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:31:31 所属栏目:Java 来源:网络整理
导读:首先,对不起,如果已经提出这个问题,但我找不到任何类似的问题,也没有找到我的问题的答案. 我的问题是,我在几个层次结构级别中有几个继承自一个子类的子类. @Entity public class A{ } @Entity public class B extends A { ... } @Entity public class C exte
首先,对不起,如果已经提出这个问题,但我找不到任何类似的问题,也没有找到我的问题的答案.

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

@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?

或者我做错了什么?

非常感谢你提前!

最好的祝福,
Q

解决方法

抱歉漫长的等待!

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

如果使用“每类表”或“连接表”继承策略,则D和E的数据存储在单独的表中,并从C eq中选择e1,其中someAttribute = ….或anotherAttribute = ….不起作用,因为C中不存在这些列.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读