在Spring-Data JPA中,使用Contains查询和一个项目列表来搜索多列。

12 浏览
0 Comments

在Spring-Data JPA中,使用Contains查询和一个项目列表来搜索多列。

我正在开发一个图书馆API,我的目标是搜索一本书。目前,我想要搜索的书籍有两个有趣的值:标题和简介(书的背面文字)。

底层数据库是MariaDB。

我构建了一个JPA查询:

Iterable findByTitleContainsOrBlurbContains(String query, String query2)

query和query2的内容是相同的。使用一个词进行搜索时,这种方法运行良好,但一旦出现两个或更多的词,当这些词在简介和标题之间混合时,这种方法就停止工作了。这是可以理解的。

我的第二次尝试是将每个词拆分成一个字符串值列表。

Iterable findByTitleContainsIsInOrBlurbContainsIsIn(List query, List query2);

这也不起作用。应用程序无法编译。

有没有一种方法可以在包含上下文中使用项目列表搜索两列呢?

0
0 Comments

问题的出现原因是spring-data-jpa目前不支持正则表达式查询。解决方法是使用原生查询来实现该功能。具体的解决方法是使用CONCAT_WS函数来连接列表中的元素,然后使用REGEXP来进行匹配查询。以下是代码示例:

(nativeQuery = true, value = "SELECT * FROM my_entity WHERE "
      + "attribute1 REGEXP CONCAT_WS('|', :list1) " + "OR "
      + "attribute2 REGEXP CONCAT_WS('|', :list2) ")
List findByAttributeList1Or2(
                     ("list1") Collection list1,
                     ("list2") Collection list2);

其中,CONCAT_WS函数用于将提供的列表连接起来,例如将('val1', 'val2')连接为'val1|val2'。这样可以匹配类似于'completeval2xxx'的字符串。具体的示例代码可在链接heresome tests中查看。通过使用这种方法,可以实现多列的包含查询。

0