Я пытаюсь реализовать веб-сервис, который принимает список строк, каждая из которых является регулярным выражением.Их нужно сравнить с шестью столбцами базы данных, и все строки, которые соответствуют, должны быть возвращены.
Я считаю, что в Oracle есть функция regexp_like (), которую я мог бы использовать, но я ищу лучший способ сделать это с помощью Hibernate, поэтому я не работаю с механизмом персистентности.
Я начал с чего-то вроде этого, в котором коллекция участников содержит регулярные выражения:
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);
Это не работает, потому что "in" не будет делать то, что я хочу, и это не говорит Hibernate использовать совпадение регулярного выражения.
ЭтоЕдинственный ответ, который я придумала, но выглядит он действительно безобразно:
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);
}
Я пытаюсь передать как можно больше этого в Oracle.Эта аппроксимация, вероятно, сработает, но введение ограничений без использования параметров означает, что я теряю большую потенциальную эффективность.Кто-нибудь может увидеть лучший способ сделать это?Для простоты я доверяю регулярным выражениям, которые мне передают.