Вместо отдельного p.ID используйте DISTINCT p (без поля .ID )
У меня была такая же проблема с дублирующимися строками результатов. Это решило мою проблему:
session.CreateQuery(
"SELECT DISTINCT p, o
FROM ParentClass AS p,
OtherClass AS o
INNER JOIN p.mappedBagField as bagField
WHERE ...
AND bagField.id IN (:interestingIds)")
.setParameterList("interestingIds", {1,2,3,4});
.list();
Пояснение:
ParentClass и OtherClass - это два отдельных класса с отношением no (hibernate mapped).
ParentClass.mappedBagField - это коллекция для третьего отображенного класса гибернации.
В приведенном выше примере я ищу строки с интересноIds 1, 2, 3 и 4.
Если в наборе данных ParentClass есть две записи mappedBagField с идентификаторами 2 и 4, то (оригинальный) SELECT дважды будет соответствовать вышеуказанным interrestingIds !
Это приводит к двум строкам.
При добавлении DISTINCT p к SELECT пропускаются повторяющиеся результаты: каждая строка будет отображаться только один раз (даже при наличии нескольких интересноId хитов).