Я тоже сталкивался с этой проблемой, но не нашел решения с использованием HQL ...
Подзапросы с top были бы очень хорошими, так как это быстрее, чем сначала делать полное объединение. При первом полном объединении SQL-серверы сначала присоединяются к таблице, сортируют все строки и затем выбирают верхние 30. С помощью подвыбора, верхний 30 столбец одной таблицы берется, а затем соединяется с другой таблицей. Это намного быстрее!
Мой запрос с помощью Subselect занимает около 1 секунды, запрос с объединением и сортировкой занимает 15 секунд! Так что присоединиться не было возможности.
В итоге у меня возникло два запроса, первый из которых был выбран:
IQuery q1 = session.CreateQuery("select id from table1 order by id desc");
q1.SetMaxResults(100);
А потом второй запрос
IQuery q2 = session.CreateQuery("select colone, coltwo from table2 where table1id in (:subselect)");
q2.SetParameterList("subselect", q1.List());