通过阅读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
这是否意味着数组的前半部分将在下半部分重演?
答案 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次检索。