Spring JPA 查找 属性 包含列表的实体
Spring JPA find entity where property containing List
例如:
这是我要搜索的对象的名称属性:
Lorem ipsum dolor sit amet, consectetur adipiscing elit
当我填写“lo adip tetur”(lo(=Lorem),dipi(=adipiscing),tetur(=consectetur))时,我希望能够找到这个对象。
我试图在 space 上拆分我的名字 属性 并将其传递给 jpa 方法,但我没有得到任何结果。
List<Obj> findAllByNameIgnoreCaseContaining(String[] splittedName);
解决这个问题的正确方法是什么?谢谢!
正则表达式查询将允许您指定此类复杂文本搜索条件。
许多数据库都支持正则表达式,并且可以在使用本机查询时提供。
postgres 的示例如下所示:
@Query(nativeQuery = true, value =
"SELECT * FROM my_entity
WHERE text_column ~ :contentRegex")
List<MyEntity> findByContentRegex(@Param("contentRegex") String contentRegex);
要匹配前三个单词的前两个字符,您可以像这样传递一个正则表达式:
var result = repository.findByContentRegex("^Lo\S*\sip\S*\sdo.*");
(以 Lo
开头的字符串,后跟任意数量的 non-whitespace 个字符,一个空白字符,ip
,任意数量的 non-whitespace 个字符,一个空白字符,do
,以及任意数量的任意字符)
当然你可以动态地assemble正则表达式,例如通过连接 user-supplied 个搜索词片段:
List<String> searchTerms = List.of("Lo", "ip", "do"); // e.g. from http request url params
String regex = "^"+String.join("\S*\s", searchTerms) + ".*";
var result = repository.findByContentRegex(regex);
参见例如https://regex101.com/ 互动游乐场。
请注意,复杂的表达式可能会导致查询变得昂贵,因此在某些时候可能会考虑更高级的方法,例如可以利用特殊索引的全文搜索。 https://www.postgresql.org/docs/current/textsearch-intro.html
另请注意,setting a query timeout is recommended 用于潜在的敌对参数源。
除此之外,还有更专业的搜索服务器,例如像 apache-solr.
例如:
这是我要搜索的对象的名称属性:
Lorem ipsum dolor sit amet, consectetur adipiscing elit
当我填写“lo adip tetur”(lo(=Lorem),dipi(=adipiscing),tetur(=consectetur))时,我希望能够找到这个对象。
我试图在 space 上拆分我的名字 属性 并将其传递给 jpa 方法,但我没有得到任何结果。
List<Obj> findAllByNameIgnoreCaseContaining(String[] splittedName);
解决这个问题的正确方法是什么?谢谢!
正则表达式查询将允许您指定此类复杂文本搜索条件。
许多数据库都支持正则表达式,并且可以在使用本机查询时提供。
postgres 的示例如下所示:
@Query(nativeQuery = true, value =
"SELECT * FROM my_entity
WHERE text_column ~ :contentRegex")
List<MyEntity> findByContentRegex(@Param("contentRegex") String contentRegex);
要匹配前三个单词的前两个字符,您可以像这样传递一个正则表达式:
var result = repository.findByContentRegex("^Lo\S*\sip\S*\sdo.*");
(以 Lo
开头的字符串,后跟任意数量的 non-whitespace 个字符,一个空白字符,ip
,任意数量的 non-whitespace 个字符,一个空白字符,do
,以及任意数量的任意字符)
当然你可以动态地assemble正则表达式,例如通过连接 user-supplied 个搜索词片段:
List<String> searchTerms = List.of("Lo", "ip", "do"); // e.g. from http request url params
String regex = "^"+String.join("\S*\s", searchTerms) + ".*";
var result = repository.findByContentRegex(regex);
参见例如https://regex101.com/ 互动游乐场。
请注意,复杂的表达式可能会导致查询变得昂贵,因此在某些时候可能会考虑更高级的方法,例如可以利用特殊索引的全文搜索。 https://www.postgresql.org/docs/current/textsearch-intro.html
另请注意,setting a query timeout is recommended 用于潜在的敌对参数源。
除此之外,还有更专业的搜索服务器,例如像 apache-solr.