【问题标题】:JPA2 Criteria Builder - Queries on abstract classes and multiple subclassesJPA2 Criteria Builder - 抽象类和多个子类的查询
【发布时间】: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 上执行查询时,无法访问例如 someAttributeD。像这样:



    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


    【解决方案1】:

    抱歉让您久等了!

    这是一个我经常看到的好问题。问题是您假设有关 C 的子类型的信息,这并不完全正确。

    如果您使用“每个类的表”或“连接表”继承策略,则 D 和 E 的数据存储在单独的表中,select e1 from C eq where someAttribute = .... or anotherAttribute = .... 将不起作用,因为这些列在 C 中不存在。

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

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2019-04-01
      • 2015-03-04
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 2011-10-17
      相关资源
      最近更新 更多