【问题标题】:jpa join query on a subclass对子类的 jpa 连接查询
【发布时间】:2010-06-02 11:38:21
【问题描述】:

我在JPA(休眠)中有以下关系。

对象 X 有两个子类 Y 和 Z。

对象 A 与对象 X 具有多对一关系。(注意,这是一种单向关系,因此对象 X 无法看到对象 A)。

现在,我想获取对象 A 中列的最大值,但仅限于关系属于特定子类型的情况,即...Y。

因此,这等于...在与 Y 有关系的所有 A 实例中,获取对象 A 中 column1 的最大值。这可能吗?我对如何查询它有点迷茫。

我在想这样的事情:

String query = "SELECT MAX(a.columnName) FROM A a join a.x;
Query query = super.entityManager.createQuery(query);
query.execute();

但是这并没有考虑到 X 的子类......所以我有点迷茫。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql hibernate jpa polymorphism polymorphic-associations


    【解决方案1】:

    JPA 2.0 允许查询使用 TYPE 运算符限制从多态查询返回的类。来自 JPA 2.0 规范:

    4.6.17.4 实体类型表达式

    可以使用实体类型表达式 限制查询多态性。这 TYPE 运算符返回确切的类型 论据。

    实体类型的语法 表达式如下:

    entity_type_expression ::=
             type_discriminator |
             entity_type_literal |
             input_parameter
    type_discriminator ::=
             TYPE(identification_variable |
                    single_valued_object_path_expression |
                    input_parameter )
    

    指定了一个entity_type_literal 按实体名称。

    使用了实体的Java类 作为输入参数来指定 实体类型。

    例子:

    SELECT e
    FROM Employee e
    WHERE TYPE(e) IN (Exempt, Contractor)
    
    SELECT e
    FROM Employee e
    WHERE TYPE(e) IN (:empType1, :empType2)
    
    SELECT e
    FROM Employee e
    WHERE TYPE(e) IN :empTypes
    
    SELECT TYPE(e)
    FROM Employee e
    WHERE TYPE(e) <> Exempt
    

    JPA 1.0 不提供这样的机制,因此如果您使用的是 JPA 1.0,则使用标准 JPQL 是不可能的。

    如果您不介意使用专有 HQL,则可以使用特殊属性 class

    同样,特殊属性class 在多态持久化的情况下访问实例的鉴别器值。嵌入在 where 子句中的 Java 类名将被翻译成它的鉴别器值。

    from Cat cat where cat.class = DomesticCat
    

    所以在你的情况下,我会尝试这样的事情:

    SELECT MAX(a.columnName) FROM A a where a.x.class = Y
    

    【讨论】:

    • 感谢帕斯卡的彻底而清晰的回答!真的很感激!
    【解决方案2】:

    我还没有测试过,但是试试这样的:

    SELECT MAX(a.columnName) FROM A a join a.x WHERE a.x.class= y.class

    希望对你有帮助, 安东

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2011-12-21
      • 2023-03-06
      • 2012-01-01
      • 2016-05-23
      • 1970-01-01
      相关资源
      最近更新 更多