MongoDB 存储库通过 @Query 注解的 collation 属性支持排序规则。
示例:存储库的排序规则支持
public interface PersonRepository extends MongoRepository<Person, String> {
   @Query(collation = "en_US")  // (1)
   List<Person> findByFirstname(String firstname);
   @Query(collation = "{ 'locale' : 'en_US' }") // (2)
   List<Person> findPersonByFirstname(String firstname);
   @Query(collation = "?1") // (3)
   List<Person> findByFirstname(String firstname, Object collation);
   @Query(collation = "{ 'locale' : '?1' }") // (4)
   List<Person> findByFirstname(String firstname, String collation);
   List<Person> findByFirstname(String firstname, Collation collation); // (5)
   @Query(collation = "{ 'locale' : 'en_US' }")
   List<Person> findByFirstname(String firstname, @Nullable Collation collation); // (6)
}其中:
(1)静态排序规则定义,将导致 { 'locale' : 'en_US' }。
(2)静态排序规则定义,将导致 { 'locale' : 'en_US' }。
(3)动态排序规则取决于第二个方法参数,允许的类型包括字符串(例如:“en_US”)、Locacle(例如:Locacle.US)和Docuemnt(例如:new Document("locale", "en_US"))。
(4)动态排序规则取决于第二个方法参数。
(5)将排序规则方法参数应用于查询。
(6)排序规则方法参数将覆盖默认排序规则,如果不是 null,则 @Query。
注意:如果为存储库查找器方法启用了自动索引创建,则在创建索引时将包括潜在的静态排序规则定义,如 (1) 和 (2) 所示。
为了简化整个代码库中排序规则属性的使用,还可以使用 @Collation 注解,它作为上述注解的元注解。另外,直接使用 @Collation 将取代在 @Query 和其他注解上定义的任何排序值。这意味着,如果排序规则是通过 @Query 和 @collation 声明的,那么将从 @collation 中选择一个排序规则。
示例:使用 @Collation 注解
// 替代 @Document(collation=…)
@Collation("en_US")
class Game {
   // ...
}
interface GameRepository extends Repository<Game, String> {
   // 替代 @Query(collation=…)
   @Collation("en_GB")
   List<Game> findByTitle(String title);
   // 优先使用 @Collation 排序规则
   @Collation("de_AT")
   @Query(collation="en_GB")
   List<Game> findByDescriptionContaining(String keyword);
}
            