在Spring-Data JPA中,使用Contains查询和一个项目列表来搜索多列。
在Spring-Data JPA中,使用Contains查询和一个项目列表来搜索多列。
我正在开发一个图书馆API,我的目标是搜索一本书。目前,我想要搜索的书籍有两个有趣的值:标题和简介(书的背面文字)。
底层数据库是MariaDB。
我构建了一个JPA查询:
IterablefindByTitleContainsOrBlurbContains(String query, String query2)
query和query2的内容是相同的。使用一个词进行搜索时,这种方法运行良好,但一旦出现两个或更多的词,当这些词在简介和标题之间混合时,这种方法就停止工作了。这是可以理解的。
我的第二次尝试是将每个词拆分成一个字符串值列表。
IterablefindByTitleContainsIsInOrBlurbContainsIsIn(List query, List query2);
这也不起作用。应用程序无法编译。
有没有一种方法可以在包含上下文中使用项目列表搜索两列呢?
问题的出现原因是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) ") ListfindByAttributeList1Or2( ("list1") Collection list1, ("list2") Collection list2);
其中,CONCAT_WS
函数用于将提供的列表连接起来,例如将('val1', 'val2')
连接为'val1|val2'
。这样可以匹配类似于'completeval2xxx'的字符串。具体的示例代码可在链接here和some tests中查看。通过使用这种方法,可以实现多列的包含查询。