如何在Hibernate / Oracle中使用正则表达式

时间:2010-12-02 16:12:10

标签: sql regex oracle hibernate seam

我正在尝试实现一个接受字符串列表的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。这个appraoch似乎很有用,但是在不使用参数的情况下实施限制意味着我失去了很多潜在的效率。任何人都可以看到更好的方法吗?为简单起见,我相信传递给我的正则表达式。

2 个答案:

答案 0 :(得分:7)

hibernate文档中没有任何内容可用于执行正则表达式查询(使用HQL或Criteria查询)。使用sqlRestrictions的方法可能应该更改为其中一个重载方法,以避免SQL注入漏洞。

示例代码:

Restrictions.sqlRestriction("regexp_like({alias}.NODE_1, ?)", re, Hibernate.STRING)

答案 1 :(得分:0)

类似的工作示例

 Criterion criterion = Restrictions.sqlRestriction("regexp_like (column_name, ?, 'i')", "(^|\\s)"+searchValue+"($|\\s|.$)", StringType.INSTANCE);