【发布时间】:2010-12-02 16:12:09
【问题描述】:
我正在尝试实现一个接受字符串列表的 Web 服务,每个字符串都是一个正则表达式。这些需要与数据库的六列进行比较,并且需要返回任何匹配的行。
我相信 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。这种方法似乎可行,但是在不使用参数的情况下设置限制意味着我失去了很多潜在的效率。谁能看到更好的方法来做到这一点?为简单起见,我相信传递给我的正则表达式。
【问题讨论】:
标签: sql regex oracle hibernate seam