Spring Data Mongodb 中的 findBy In 不区分大小写。

10

我试图创建一个Spring Data MongoDB仓库方法来执行对给定列表中字段的不区分大小写搜索,这是类似于SQL 'IN'运算符的功能。

在我的仓库中,我有以下方法:

User findByUsername(@Param("username") String username);
User findByUsernameIgnoreCase(@Param("username") String username);
Page<User> findByUsernameIn(@Param("username") List<String> username, Pageable pageable);
Page<User> findByUsernameIgnoreCaseIn(@Param("username") List<String> username, Pageable pageable);
Page<User> findByUsernameInIgnoreCase(@Param("username") List<String> username, Pageable pageable);
Page<User> findByUsernameInAllIgnoreCase(@Param("username") List<String> username, Pageable pageable);

我同样使用 @RepositoryRestResource 将仓库暴露为REST资源。

前三种方法都能按照我的期望很好地工作。使用 findByUsernameIgnoreCase 时,搜索会忽略大小写。在 findByUsernameIn 中使用给定的字符串列表可以正确地找到用户。

我的问题是,我无法同时使用 InIgnoreCase 后缀。最后两个方法也能正常工作,但它们不会像我想要的那样忽略字符串的大小写。

有没有一种方法可以执行不区分大小写的 IN 搜索,而不必明确指定MongoDB的 @Query

(尝试过spring-data-mongodb:1.8.4、spring-data-rest-core:2.4.4)


你尝试过findByUsernameInAllIgnoreCase()吗?不确定它是否有效,但值得一试。 - DavidA
是的,和其他人一样,在子句中起作用,“AllIgnoreCase”被忽略了。(我会更新问题) - Sergey Shcherbakov
你能否使用$in进行标准的mongodb查询,而且不区分大小写?我只是想知道mongoDB是否直接支持它,以防它被忽略了,而不是Spring数据。抱歉我自己没有尝试过。 - DavidA
我没有尝试使用"In"直接编写MongoDb查询,但是我能够使用$regex编写一个简单的不区分大小写的Mongo查询。 - Sergey Shcherbakov
我刚刚遇到了同样的问题。你解决了吗? - michaelbahr
显示剩余2条评论
1个回答

2

强制不区分大小写的搜索方法之一是更改排序规则设置。默认情况下,强度为3。您需要将其设置为2,以使其不区分大小写。

@Query(collation = "{'locale': 'en_US', 'strength': 2}")
Page<User> findByUsernameIn(@Param("username") List<String> username, Pageable pageable);

谢谢!显然,在我的问题之后几个月,Mongodb 3.4发布了排序支持。 :) - Sergey Shcherbakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接