当前位置: 首页 > 知识库问答 >
问题:

如何在Spring数据规范中使用POSIX正则表达式

洪璞瑜
2023-03-14

这是一本以“word1;word2;word3”的方式包含“文字”的书:

@Entity
@Table(name = "books")
public class Book {
    ... 

    @Column(name ="words")
    private String words;
}

我需要找到包含指定单词的书籍。我有:

@Repository
public interface BookRepository extends JpaRepository<Book, Long>, JpaSpecificationExecutor<Book> {}

@Service
@AllArgsConstructor
public class BookServiceImpl implements BookService {

    private BookRepository bookRepository;

    @Override
    public List<Book> getAllBooksByWord(String word) {
        return bookRepository.findAll(BookSpecification.hasWord(word));
    }
}

public class BookSpecification {

    public final String delimiter = ";";

    public static Specification<Book> hasWord(String word) {
        return (root, query, cb) -> 
            cb.like(
                root.get("words"), 
                MessageFormat.format("^{0}{1}|^{0}$|.*{1}{0}{1}.*|{1}{0}$", word, delimiter)
            );
    }
}

问题是cb。like()不适用于我可以在postgresql中使用的POSIX正则表达式。使用cb。like()方法,我得到一个查询选择。。。从书中可以看到像“^w|^w$|*;w、 .|;这不理解POSIX正则表达式,WHERE子句不起作用。

是否有一种方法可以强制cb.like()使用理解POSIX的~"运算符创建查询,而不是像:SELECT... from book WHERE word~'^w;|^w$|.*; w;.*|; w$'

共有1个答案

麹高远
2023-03-14

是的,这是可能的,但是您需要在PostgreSQL中创建一个函数:

create or replace function regexp_match(v_text in varchar, v_regexp in varchar) returns boolean
    language plpgsql strict immutable
as
$$
begin
  return v_text ~ v_regexp;
end
$$;

标准:

cb.equal(
   cb.function(
      "regexp_match",
      Boolean.class,
      root.get("words"),
      MessageFormat.format("^{0}{1}|^{0}$|.*{1}{0}{1}.*|{1}{0}$", word, delimiter)
   ),
   cb.literal(true)
)

不过,我不确定HBN是否允许绑定布尔值

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

  • 问题内容: 我正在尝试在sqlite中使用正则表达式搜索数据库。这是我的代码: 但是我收到此错误: 我之前在MySQL中使用过函数REGEXP,所以我认为它存在于sqlite中,但显然不存在。 在Android中查询sqlite数据库时执行正则表达式的最佳方法是什么? 问题答案: 在sqllite中,默认情况下不包括“ REGEXP”功能,您需要“自己滚动”。 但是,只要搜索相当简单,“ LIKE

  • 问题内容: 我正在尝试实现一个接受字符串列表的Web服务,每个字符串都是一个正则表达式。需要将这些与数据库的六列进行比较,并且需要返回任何匹配的行。 我相信Oracle具有我可以使用的regexp_like()函数,但是我正在寻找使用Hibernate做到这一点的 最佳 方法,因此,我不反对持久性引擎。 我从这样的东西开始,其中参与者集合包含正则表达式: 这是行不通的,因为“输入”不会执行我想要的

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

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

  • 问题内容: 我正在使用正则表达式来验证字符串中的特定格式。该字符串将成为游戏规则。 示例:根据规则,“ DX 3”也可以,但是“ DX 14”也可以。。。我知道如何查看字符串并找到一个或多个“数字”,因此问题在于正则表达式将也匹配34,这个数字超出了规则的“范围” … 我是否缺少有关正则表达式的功能?还是根本不可能? 问题答案: 不幸的是,没有简单的方法可以在正则表达式中定义范围。如果要使用范围1