我有这个测试 HQL:
select distinct o from Order o left join fetch o.lineItems
and it does生成一个没有明显原因的不同 SQL:
select distinct order0_.id as id61_0_, orderline1_.order_id as order1_62_1_...
SQL 结果集始终相同(有或没有 SQL 不同):
order id | order name | orderline id | orderline name
---------+------------+--------------+---------------
1 | foo | 1 | foo item
1 | foo | 2 | bar item
1 | foo | 3 | test item
2 | empty | NULL | NULL
3 | bar | 4 | qwerty item
3 | bar | 5 | asdfgh item
为什么hibernate会生成不同的SQL? SQL 不同没有任何意义,并且使查询速度比需要的慢。
这与FAQ其中提到在这种情况下 hql unique 只是结果转换器的快捷方式:
session.createQuery("选择不同的o
from Order o left join 获取
o.lineItems").list();
看起来您在这里使用了 SQL DISTINCT 关键字。当然,这不是SQL,这是HQL。在本例中,这个不同只是结果转换器的快捷方式。是的,在其他情况下,HQL DISTINCT 将直接转换为 SQL DISTINCT。在这种情况下不行:您无法在 SQL 级别过滤掉重复项,产品/连接的本质禁止这样做 - 您想要重复项,否则您无法获得所需的所有数据。
thanks
仔细看看 hibernate 生成的 sql 语句 - 是的,它确实使用了“distinct”关键字,但不是以我认为您期望的方式(或 Hibernate FAQ 暗示的方式),即返回一组“不同的”或“独特的”订单。
它不使用 unique 关键字返回不同的订单,因为考虑到您还指定了联接,这在该 SQL 查询中没有意义。
生成的 sql 集仍然需要由 ResultTransformer 处理,因为显然 sql 集包含重复的订单。这就是为什么他们说 HQL 不同关键字不直接映射到 SQL 不同关键字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)