为什么 hibernate hql 不同会导致左连接上的 sql 不同?

2023-11-22

我有这个测试 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(使用前将#替换为@)

为什么 hibernate hql 不同会导致左连接上的 sql 不同? 的相关文章

随机推荐