Hibernate中的多态查询

时间:2014-12-20 10:55:34

标签: java hibernate

通过阅读Hibernate参考指南,我遇到了:

14.8。多态查询

如下的查询:

from Cat as cat

不仅返回Cat的实例,还返回像DomesticCat这样的子类。 Hibernate查询可以在from子句中命名任何Java类或接口。该查询将返回扩展该类或实现该接口的所有持久化类的实例。以下查询将返回所有持久对象:

from java.lang.Object o

Named接口可能由各种持久化类实现:

from Named n, Named m where n.name = m .name

请注意,最后两个查询将需要多个SQL SELECT。这意味着订单 by子句没有正确排序整个结果集。 (这也意味着你无法使用调用这些查询 Query.scroll()方法。)

所以问题是,最后一个查询会返回什么?

from Named n, Named m where n.name = m .name

它将是一个实现“命名”的所有对象的数组,都具有相同的“名称”值,因为它是“双重请求”

from Named n, Named m

这是否意味着数组的前半部分将在下半部分重演?

1 个答案:

答案 0 :(得分:0)

不,它不会在下半场重演,但可能存在多个相等对象的实例

select * from a,a
只计算carthesian乘积a和a(即get的所有行与a的所有行连接),例如,如果表a只包含id-column且值为1,2, 3上述查询为您提供以下


+-------------+
| a.id | b.id |
|-------------|
|  1   |  1   |
|  1   |  2   |
|  1   |  3   |
|  2   |  1   |
...
|  3   |  3   |
+-------------+

所以

select id from a,a where a.id = b.id
会返回


+------+
| a.id |
|------|
|  1   |
|  2   |
|  3   |
+------+

因此,您的查询将至少重新启动在数据库中实现Named的所有对象,如果多次存在,则可能会重复一些重复。使用以下数据库


+-------------+
| id   | name |
|-------------|
|  1   |  a   |
|  2   |  a   |
|  3   |  b   |
+-------------+

您的查询为您提供


+----+------+----+------+
| id | name | id | name |
+----+------+----+------+
|  1 | a    |  1 | a    |
|  2 | a    |  1 | a    |
|  1 | a    |  2 | a    |
|  2 | a    |  2 | a    |
|  3 | b    |  3 | b    |
+----+------+----+------+

因为两个条目具有相同的名称,所以第一个条目与自身连接,另一个条目与第二个条目相同,这意味着如果你有n个具有相同名称的对象,则hibernate将对每个对象进行n次检索。