【问题标题】:How to use regular expressions with Hibernate/Oracle如何在 Hibernate/Oracle 中使用正则表达式
【发布时间】: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


    【解决方案1】:

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

    示例代码:

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

    【讨论】:

    • 如果您需要使用 Oracle 提供的 :alpha: 运算符,则效果很好,因为用 \\: 覆盖 : 似乎从来没有工作过。
    【解决方案2】:

    类似的工作示例

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多