Как бы ни был сложен запрос, вы можете в конечном итоге преобразовать его в QueryOver он может стать немного трудным и трудным для чтения, но тогда у вас будет очень строго типизированный API.
Сказав, что вы всегда можете использовать HQL на своей объектной модели для достижения того же.
Session.CreateQuery("").List<>();
если это сложно, то всегда есть SQL, чтобы сделать то же самое.
Session.CreateSqlQuery("").ExecuteUpdate<>();
Session.CreateSqlQuery("").List<>();