代码之家  ›  专栏  ›  技术社区  ›  Eli Acherkan

如何在Hibernate中执行非多态的HQL查询?

  •  28
  • Eli Acherkan  · 技术社区  · 15 年前

    我使用的是Hibernate3.1.1,尤其是HQL查询。

    根据 documentation ,Hibernate的查询是多态的:

    类似的查询: from Cat as cat 不仅返回的实例 Cat 但也属于类似的子类 DomesticCat .

    我如何查询cat的实例,而不是它的任何子类的实例?

    我希望能够做到这一点而不必明确地提到每个子类。

    我知道以下选项,但不满意:

    1. 在查询后手动筛选实例,或者:
    2. 在鉴别器列上手动添加WHERE子句。

    Hibernate允许用户决定查询是否应该是多态的,这是有意义的,但是我找不到这样的选项。

    事先谢谢!

    5 回复  |  直到 9 年前
        1
  •  25
  •   skaffman    15 年前

    使用 polymorphism="explicit" class mapping . 这将导致查询只返回已命名类的实例,而不返回其子类。

    隐性多态性意味着 类的实例将 由命名为any的查询返回 超类或实现的接口或 类,以及 将返回类的子类 通过命名类的查询 本身。显式多态性意味着 将返回该类实例 仅通过显式命名的查询 那个班。

        2
  •  15
  •   Bozho    15 年前
    SELECT cat FROM Cat cat WHERE cat.class='cat'
    

    价值何处 'cat' 是的鉴别器值 Cat 班级。

    如果您正在使用 TABLE_PER_CLASS 然后尝试 cat.class='Cat' )(班级名称)

    这不是 确切地 鉴别器列上的WHERE子句,因为这样的查询将失败(鉴别器列仅在本机查询中可用)。

        3
  •  11
  •   twernt Christoph Anderson    9 年前

    JPA2(Hibernate3.5)增加了对非多态查询的支持,这与Hibernates.Class属性非常相似(正如Bozho在上面回答的那样),但它不是Hibernate特有的。这是使用类型运算符完成的。如在

    Select b from Book b where TYPE(b) = Book
    

    你可以阅读更多关于 here 在我的博客里

    埃亚尔

        4
  •  1
  •   Miguel Ping    15 年前

    ORM模仿Java模型:如果对象是另一种类型的实例(如果PsisiCCAT的实例也是CAT的实例),那么对CAT的任何查询都必须是多态的(假设您查询列表并询问条目是否匹配)。 instanceof Cat .

    即使是bozho的解决方案也有些不纯,因为“class”列对您的Hibernate映射来说是不透明的,尽管我承认这是一个很好的折衷方案。您可以通过类的简单名称简单地获得鉴别器。

    如果你感到舒适 正在使用 每班表 您总是可以对cat表执行本机查询,以获取ID,然后通过hibernate获取条目。

        5
  •  0
  •   friendlyfire    15 年前

    查看baseQueryReturnFieldsCalculatorGC;它动态地向“Where”添加一个条件,该条件只选择class=xxx的位置;您可以将此逻辑复制到hqlQueryTemplate,并让用户定义“IsOn多态”。

    注意,它只对每个层次结构的表起作用,因为只有这样,隐式类列才存在,并且是可选的。