По моему опыту, основная проблема со сложными запросами в Hibernate заключается не в самом запросе, а в создании всех объектов, представляющих набор результатов.
В моем случае на работе у нас была очень большая модель предметной области с множеством связей, так что даже выбор одного объекта из базы данных был довольно дорогим, потому что этот объект был связан с другими объектами, которые, в свою очередь, были связаны с другие объекты и т. д.
Для нас более широкое использование отложенной загрузки решило хотя бы часть проблемы. Умное кэширование помогло еще больше. Я узнал, что в будущем я позволю более слабую связь между классами домена.