У меня есть этот тестовый 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, сама природа продукта/соединения запрещает это - вам нужны дубликаты или вы не получите все данные, которые вам нужны.
спасибо