почему hibernate hql distinct вызывает sql distinct при левом соединении?

У меня есть этот тестовый HQL:

select distinct o from Order o left join fetch o.lineItems

и он действительно генерирует SQL distinct без очевидной причины:

select distinct order0_.id as id61_0_, orderline1_.order_id as order1_62_1_...

Набор результатов SQL всегда одинаков (с SQL distinct и без него):

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 distinct? SQL distinct не имеет никакого смысла и делает запрос медленнее, чем нужно. Это противоречит FAQ, в котором говорится, что hql distinct в данном случае является просто сокращением для трансформатора результатов:

session.createQuery("select distinct o из Order o left join fetch o.lineItems").list();

Похоже, что вы используете здесь ключевое слово SQL DISTINCT. Конечно, это не SQL, это HQL. В данном случае distinct - это просто сокращение для трансформатора результатов. Да, в других случаях HQL distinct преобразуется прямо в SQL DISTINCT. Но не в этом случае: вы не можете отфильтровать дубликаты на уровне SQL, сама природа продукта/соединения запрещает это - вам нужны дубликаты или вы не получите все данные, которые вам нужны.

спасибо

10
задан cherouvim 31 March 2011 в 11:06
поделиться