Como usar expressões regulares com o Hibernate / Oracle

Estou tentando implementar um serviço web que aceita uma lista de strings, cada uma das quais é uma expressão regular. Eles precisam ser comparados com seis colunas de um banco de dados e todas as linhas correspondentes devem ser retornadas.

Acredito que o Oracle tenha uma função regexp_like () que eu possa usar, mas estou procurando omelhor maneira de fazer isso usando o Hibernate, então não estou trabalhando contra o mecanismo de persistência.

Comecei com algo assim, no qual a coleção de participantes contém as expressões regulares:

List<Message> messages = new ArrayList<Message>();
List<Message> m1 = ((Session) entityManager.getDelegate())
    .createCriteria(MessageSSR.class).add(Restrictions.or(
            Restrictions.in("Node2Id", participants),
            Restrictions.in("Node2Id", participants))).list();
List<Message> m2 = ((Session) entityManager.getDelegate())
    .createCriteria(MessageSSR.class).add(Restrictions.or(
            Restrictions.in("Node3Id", participants),
            Restrictions.in("Node4Id", participants))).list();
List<Message> m3 = ((Session) entityManager.getDelegate())
    .createCriteria(MessageSSR.class).add(Restrictions.or(
            Restrictions.in("Node5Id", participants),
            Restrictions.in("Node6Id", participants))).list();
messages.addAll(m1);
messages.addAll(m2);
messages.addAll(m3);

Isso não funciona porque "in" não fará o que eu quero, e isso não parece indicar ao Hibernate para usar uma correspondência de expressão regular.

Esta é a única resposta que eu tenho, mas parece realmente feia:

List<Message> messages = new ArrayList<Message>();
for (String re : participants) {
    List<Message> m1 = ((Session) entityManager.getDelegate())
        .createCriteria(MessageSSR.class)
        .add(Restrictions.or(
                Restrictions.sqlRestriction("regexp_like(NODE_1, " + re + ")"),
                Restrictions.sqlRestriction("regexp_like(NODE_2, " + re + ")")
        )).list();
    List<Message> m2 = ((Session) entityManager.getDelegate())
        .createCriteria(MessageSSR.class)
        .add(Restrictions.or(
                Restrictions.sqlRestriction("regexp_like(NODE_3, " + re + ")"),
                Restrictions.sqlRestriction("regexp_like(NODE_4, " + re + ")")
        )).list();
    List<Message> m3 = ((Session) entityManager.getDelegate())
        .createCriteria(MessageSSR.class)
        .add(Restrictions.or(
                Restrictions.sqlRestriction("regexp_like(NODE_5, " + re + ")"),
                Restrictions.sqlRestriction("regexp_like(NODE_6, " + re + ")")
        )).list();
    messages.addAll(m1);
    messages.addAll(m2);
    messages.addAll(m3);
}

Estou tentando enviar o máximo possível para a Oracle. É provável que essa abordagem funcione, mas colocar as restrições sem usar parâmetros significa que estou perdendo muita eficiência em potencial. Alguém pode ver uma maneira melhor de fazer isso? Para simplificar, confio nas expressões regulares que estão sendo transmitidas para mim.

questionAnswers(2)

yourAnswerToTheQuestion