Соединение выборки делает трюк:
String PQ = "выберите k из Customer k внутреннее объединение FETCH k.winterSet против vs.year =: year";
Отладка в спящем режиме указывает, чтоПроизведенный sql включает в себя пункт where.Но, поскольку отношение отображается LAZY, коллекция не заполняется из этого запроса, а только объекты Customer.При последующем доступе к коллекции загрузка запускается, но на этом этапе предложение were давно исчезло, и все объекты загружаются.
Однако при использовании "join fetch", который фактически загружает всеОбъекты из запроса сразу, hibernate заполняет все из набора результатов запроса, и, следовательно, в коллекции присутствуют только нужные объекты.Это, конечно, гораздо более эффективно, выполняется только один запрос, и нет необходимости загружать каждый из объектов в коллекции, а просто отбрасывать большинство из них.
Редактировать: работает только в спящем режиме, иможет иметь серьезные побочные эффекты, если результат будет изменен.Смотрите комментарий.