我正在尝试实现一个 Web 服务,它接受一个字符串列表,每个字符串都是一个正则表达式。这些需要与数据库的六列进行比较,并且需要返回任何匹配的行。
我相信 Oracle 有一个 regexp_like() 函数,我可能可以使用它,但我正在寻找best使用 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。这种方法似乎可能有效,但是在不使用参数的情况下施加限制意味着我失去了很多潜在的效率。谁能找到更好的方法来做到这一点?为简单起见,我信任传递给我的正则表达式。