当前位置: 首页 > 面试题库 >

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

司易安
2023-03-14
问题内容

我正在尝试实现一个接受字符串列表的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);

这是行不通的,因为“输入”不会执行我想要的操作,并且这似乎没有告诉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。这种方法似乎可行,但是在不使用参数的情况下施加限制意味着我失去了很多潜在的效率。有人可以看到更好的方法吗?为简单起见,我信任传递给我的正则表达式。


问题答案:

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

示例代码:

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


 类似资料:
  • 本文向大家介绍如何在TestNG中使用正则表达式?,包括了如何在TestNG中使用正则表达式?的使用技巧和注意事项,需要的朋友参考一下 我们在TestNG中使用正则表达式来使用以某种模式命名的一组测试方法。 示例 Testng xml文件。 所有名称开头为Payment的测试方法都将从回归套件中排除。 示例 Login()将被执行,但是所有以名字Payment开头的方法都将被排除在执行之外。这是使

  • 问题内容: 我正在尝试构建一个可以通过HQL regex关键字进行搜索的API, 编辑:在HQL中执行正则表达式搜索的最佳方法是使用条件Restrictions.like()或Restrictions.ilike()。 希望这可以帮助某人 问题答案: HQL没有正则表达式。如果要将特定于数据库提供程序的构造用于正则表达式,则应修改Dialect。该问题包含有关如何使用Oracle数据库执行此操作的

  • 问题内容: 我正在使用这样的构造: 但是我需要选择所有以“某些文本”开头的文本的链接,所以我想知道这里是否可以使用regexp?在lxml文档中找不到任何内容 问题答案: 您可以执行此操作(尽管该示例不需要正则表达式)。Lxml支持来自EXSLT扩展功能的正则表达式。(请参阅XPath类的lxml文档,但该方法也适用于该方法) 请注意,您需要提供名称空间映射,以便它知道xpath表达式中的“ re

  • 本文向大家介绍您如何在Cucumber中使用正则表达式?,包括了您如何在Cucumber中使用正则表达式?的使用技巧和注意事项,需要的朋友参考一下 我们可以在Cucumber中使用正则表达式来选择功能文件中相似语句的集合。 示例 功能文件 步骤定义文件具有@Given(“([^ \”] *)season $“)中的@Given时间表,该表在正则表达式的帮助下将两个Given语句映射到Feature

  • 问题内容: 我有一些用生成的uuid1字符串命名的图像。例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。我想使用“查找”命令找出所有这些图像: 但这是行不通的。正则表达式有问题吗?有人可以帮我吗? 问题答案: 请注意,由于与整个路径匹配,因此需要在开头指定。 例: 我的find版本:

  • 问题内容: 我想在内部使用,该怎么办Python? 问题答案: 从python 3.6开始,你还可以使用文字字符串插值。在你的特定情况下,解决方案是: