Para mim, os critérios são bastante fáceis de entender e fazer consultas dinâmicas. Mas a falha que eu digo até agora é que ele carrega todas as relações etc, porque temos apenas três tipos de FetchModes, isto é, Select, Proxy e Default e, em todos esses casos, carrega muitos (pode ser que eu esteja errado, se for o caso) estou fora :))
A segunda questão com os Critérios é que ele carrega o objeto completo, ou seja, se eu quiser carregar o EmpName de um funcionário, ele não cria esse instante, ele cria o objeto Employee completo e posso obter o EmpName por causa disso, ele realmente funciona mal em relatórios . onde o HQL apenas carrega (não carrega associação / relações) o que você deseja, para aumentar o desempenho muitas vezes.
Um recurso dos Critérios é que ele protegerá você do SQL Injection por causa de sua geração dinâmica de consultas, onde, no HQL, suas consultas são fixas ou parametrizadas, portanto, não são seguras do SQL Injection.
Além disso, se você escrever HQL em seus arquivos aspx.cs, estará fortemente associado ao seu DAL.
No geral, minha conclusão é que existem lugares em que você não pode viver sem o HQL como relatórios, portanto, use-os, caso contrário, os critérios são mais fáceis de gerenciar.