Do CriteriaQuery code more readable and elegant
In general this looks okay to me.  In fact I have a similar pattern in
an application with lots of optional filters.  Newer Java 8 features
which can make this a bit nicer (e.g. using Optional and method
references).


Throwing/catching RuntimeException like that looks iffy.  At least
add a message to the exception so the reader knows how to interpret
this.
Returning a List only to immediately convert it to an array doesn't
sound that useful, then again, if it's being used from other places it
might be okay.  List also has isEmpty, better than having to call
yet another static function for it.
CriteriaQuery.where
is already using the conjunction, no need to add the and there.
Note that the array can be passed for the
varargs arguments:

if (!CollectionUtils.isEmpty(predicates)) {
    cq.where(predicates.toArray(new Predicate[predicates.size()]));
}

For the the string matching queries additional helper methods might be
nice:

private static startsWithLower(Expression&lt;String&gt; expression, String pattern) {
    return cb.like(cb.lower(expression), pattern.toLowerCase() + "%");
}