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); }