Cómo usar expresiones regulares con Hibernate / Oracle

Estoy tratando de implementar un servicio web que acepte una lista de cadenas, cada una de las cuales es una expresión regular. Estos deben compararse con seis columnas de una base de datos, y cualquier fila que coincida debe devolverse.

Creo que Oracle tiene una función regexp_like () que podría usar, pero estoy buscando elmejor manera de hacer esto usando Hibernate, por lo que no estoy trabajando en contra del motor de persistencia.

Comencé con algo como esto, en el que la colección de participantes contiene las expresiones 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);

Esto no funciona porque "in" no hará lo que quiero, y esto no parece decirle a Hibernate que use una coincidencia de expresión regular.

Esta es la única respuesta que se me ocurrió, pero se ve realmente fea:

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);
}

Estoy tratando de llevar todo lo que pueda a Oracle. Parece probable que esta aplicación funcione, pero poner las restricciones sin usar parámetros significa que estoy perdiendo mucha eficiencia potencial. ¿Alguien puede ver una mejor manera de hacer esto? Por simplicidad, estoy confiando en las expresiones regulares que me están pasando.

Respuestas a la pregunta(2)

Su respuesta a la pregunta