Одна из главных причин избегать использования SQL и использования HQL - избегать зависимости базы кода от типа СУБД (например, MySQL, Oracle). Другая причина заключается в том, что вы должны сделать свой код зависимым от имен таблиц и столбцов, а не от имен и свойств сущностей.
Если вы сравниваете необработанный SQL с использованием провайдера NHibernate LINQ, есть и другие веские причины обращаться к запросам LINQ (когда это работает), например, безопасность типов и возможность использовать поиск ссылок VS, чтобы определить, в каких запросах определенный ссылка на таблицу или столбец.
Мое мнение таково, что CreateSQLQuery () является опцией "последнего выхода". Это происходит потому, что есть вещи, которые вы не можете сделать с другими API-интерфейсами NHibernate, но этого следует избегать, поскольку это более или менее противоречит самой идее использования NHibernate.