Использования нативных запросов следует избегать. Они нужны только в тех редких случаях, когда возможностей ORM не хватает, но и отказываться от ORM не хочется.
HQL лаконичен и прост, что позволяет быстро набросать простую логику работы с базой. Но, во-первых, правильность HQL-запроса невозможно проверить на этапе компиляции, как и соответствие типов получаемых им параметров или возвращаемых им значений, а значит увеличивается шанс падения приложения в процессе работы и становится существенно тяжелее поиск ошибок. А, во-вторых, HQL плохо подходит для динамического конструирования запроса.
Criteria API наоборот многословен и лучше подходит для сложной логики работы с базой, зато позволяет отловить ошибки ещё на этапе компиляции и динамически построить запрос.