在阅读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子句中显式命名的类,还适用于多态关联,稍后您将看到。
问题:多态查询有什么用?如何以及何时使用。
答案 0 :(得分:-2)
java beats为多态查询发布了一个很好的答案。
http://javabeat.net/implicit-polymorphism-hibernate/
更新:我的不好,忘了提到他们用了一个例子来解释多态查询,这里有:
假设我们有两个类CreditCardPayment和DebitCardPayment,并且它们都扩展了Payment超类,并且这三个类中的每一个在数据库中都有自己的表,因为已经使用了每个类策略的表。在某个时间点,如果我们想要检索通过现金或卡进行的所有付款的清单,那么下面的查询将会有所作为。
session.createCriteria(Payment.class).LIST();
在处理此条件查询时,hibernate执行以下操作 -
确定付款的所有子类,这些子类映射到任何表 向所有表激发单个查询 将所有查询的结果合并到列表中并从休眠层返回
虽然,hibernate在内部完成,但我们真的只需要一个查询来获取这两种类型的卡的所有数据。因此,hql中使用的查询是多态的。