обычно для этого втыкают distinct
честно, я не знаю как именно происходит инициализация managed объектов, но я сталкивался с такой проблемой и немного разобрался,советую покопать в сторону разницы между join и fetch
join в отличии от fetch не инициализирует замапленные обекты но при этом увеличивает количество столбцов в result set, возможно это и является причиной проблемы и если поиграться с fetch то получится избавиться от дублей даже не добавляя distinct
вот тут можно почитать
https://thorben-janssen.com/hibernate-tip-left-join-fetch-join-criteriaquery/раздел Defining a JOIN FETCH clause кусок текста меду двумя сниппетами