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

Eli*_*kan 28 java orm hibernate

我正在使用Hibernate 3.1.1,特别是我正在使用HQL查询.

根据文档,Hibernate的查询是多态的:

像这样的查询:from Cat as cat不仅返回实例Cat,而且返回子类的实例DomesticCat.

如何查询Cat的实例,而不查询其子类的实例?

我希望能够在不必明确提及每个子类的情况下完成它.

我知道以下选项,但发现它们并不令人满意:

  1. 在查询后手动过滤实例,或者:
  2. 在discriminator列上手动添加WHERE子句.

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

提前致谢!

Rob*_*b H 25

使用polymorphism="explicit"类映射.这将导致查询仅返回指定类的实例而不返回其子类.

隐式多态意味着类的实例将由命名任何超类或实现的接口或类的查询返回,并且类的任何子类的实例将由命名类本身的查询返回.显式多态意味着类实例将仅由显式命名该类的查询返回.

  • 真棒!在我的情况下,我需要它是基于每个查询,而不是每个实体,但我认为我看到了一种方法 - 通过覆盖我的`EntityPersister`上的`isExplicitPolymorphism`方法.你当然给了我一个正确的方向. (3认同)

Boz*_*zho 15

SELECT cat FROM Cat cat WHERE cat.class='cat'
Run Code Online (Sandbox Code Playgroud)

其中值'cat'是类的鉴别值Cat.

如果你正在使用TABLE_PER_CLASS,那么试试cat.class='Cat')(该类的名称)

这是不准确的鉴别列在where子句,因为这样的查询将失败(鉴别列仅适用于原生查询).


Eya*_*upu 11

JPA 2(Hibernate 3.5)增加了对非多态查询的支持,这与Hibernates .class属性非常相似(如上面的Bozho所述),但它不是特定于Hibernate的.这是使用TYPE运算符完成的.如在

Select b from Book b where TYPE(b) = Book
Run Code Online (Sandbox Code Playgroud)

你可以阅读更多有关在这里它在我的博客

的Eyal