Если вашему запросу требуется динамическое число полей в предложении where, и вы не знаете априори, используйте критерии.Если в вашем запросе всегда используется одно и то же предложение where, но вы, возможно, можете подставить значения, используйте hql.
Вы также можете использовать критерии и в последнем случае.
Суть в том, что не нужно динамически создавать выражение hql where с кучей конкатенаций строк.