Hibernate多态查询

时间:2014-01-19 04:59:02

标签: hibernate hql polymorphism

在阅读Hibernate in Action(Christina Bauer& Gavin King)时,我在第7章中看到了以下部分

7.2.3多态查询 我们将HQL描述为面向对象的查询语言,因此它应该支持多态查询 - 即分别查询类的实例及其子类的所有实例。您已经了解了足够的HQL,我们可以证明这一点。请考虑以下查询:

来自BillingDetails的

此查询返回BillingDetails类型的对象,它是一个抽象类。因此,在这种情况下,具体对象属于BillingDetails:CreditCard和BankAccount的子类型。如果我们只想要特定子类的实例,我们可以使用

来自CreditCard的

from子句中指定的类不需要是映射的持久化类;任何班级都会这样做。以下查询返回所有持久对象:

来自java.lang.Object

当然,这也适用于接口 - 此查询返回所有可序列化的持久对象:

来自java.io.Serializable

Criteria查询也支持多态:

session.createCriteria(BillingDetails.class).LIST();

此查询返回BillingDetails及其子类的实例。同样,以下条件查询返回所有持久对象:

session.createCriteria(java.lang.Object.class).LIST();

多态性不仅适用于在from子句中显式命名的类,还适用于多态关联,稍后您将看到。

问题:多态查询有什么用?如何以及何时使用。

1 个答案:

答案 0 :(得分:-2)

java beats为多态查询发布了一个很好的答案。

http://javabeat.net/implicit-polymorphism-hibernate/

更新:我的不好,忘了提到他们用了一个例子来解释多态查询,这里有:

假设我们有两个类CreditCardPayment和DebitCardPayment,并且它们都扩展了Payment超类,并且这三个类中的每一个在数据库中都有自己的表,因为已经使用了每个类策略的表。在某个时间点,如果我们想要检索通过现金或卡进行的所有付款的清单,那么下面的查询将会有所作为。

session.createCriteria(Payment.class).LIST();

在处理此条件查询时,hibernate执行以下操作 -

确定付款的所有子类,这些子类映射到任何表 向所有表激发单个查询 将所有查询的结果合并到列表中并从休眠层返回

虽然,hibernate在内部完成,但我们真的只需要一个查询来获取这两种类型的卡的所有数据。因此,hql中使用的查询是多态的。