为什么hibernate hql distinct导致sql在左连接上不同?

che*_*vim 10 sql hibernate hql distinct

我有这个测试HQL:

select distinct o from Order o left join fetch o.lineItems
Run Code Online (Sandbox Code Playgroud)

并且它确实生成了一个SQL别而没有明显的原因:

select distinct order0_.id as id61_0_, orderline1_.order_id as order1_62_1_...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

为什么hibernate生成SQL不同?SQL distinct没有任何意义,使得查询比需要的慢.这与常见问题解答相反,后者提到在这种情况下hql distinct只是结果转换器的快捷方式:

session.createQuery("从Order o left join oetch o.lineItems中选择distinct o").list();

看起来您在这里使用SQL DISTINCT关键字.当然,这不是SQL,这是HQL.在这种情况下,这个不同只是结果转换器的快捷方式.是的,在其他情况下,HQL distinct将直接转换为SQL DISTINCT.不是在这种情况下:您无法在SQL级别过滤掉重复项,产品/连接的本质禁止这样做 - 您需要重复项或者您没有获得所需的所有数据.

谢谢

Dan*_*iuc 3

仔细看看 hibernate 生成的 sql 语句 - 是的,它确实使用了“distinct”关键字,但不是以我认为您期望的方式(或 Hibernate FAQ 暗示的方式)即返回一组“不同的”或“独特的”订单。

它不使用 unique 关键字返回不同的订单,因为考虑到您还指定了联接,这在该 SQL 查询中没有意义。

生成的 sql 集仍然需要由 ResultTransformer 处理,因为显然 sql 集包含重复的订单。这就是为什么他们说 HQL 不同关键字不直接映射到 SQL 不同关键字。