Как использовать аннотацию @Query для запросов mongodb вместе с такими методами репозитория, как findTop ⇐ JAVA
-
Anonymous
Как использовать аннотацию @Query для запросов mongodb вместе с такими методами репозитория, как findTop
У меня есть существующий репозиторий mongo, в котором не используются аннотации @Query, например
// модель @Document(коллекция="фу") общественный класс Foo { частный строковый идентификатор; частная строка businessKey; частная Дата созданияДата; } // репозиторий общедоступный интерфейс FooRepo расширяет MongoRepository { Foo findTopByBusinessKeyOrderByCreatedDateAsc (String businessKey); } Но мне нужно расширить этот репозиторий (как другую версию этой модели), в котором появится еще одно поле, и мне нужно обрабатывать код, в котором эти поля заполнены по-другому. В модель добавлено больше полей, чем я описал здесь. Обратите внимание, что они оба записаны в одну и ту же коллекцию foo. Новый Foo выглядит так
@Document(коллекция="фу") общественный класс NewFoo { частный строковый идентификатор; частная строка businessKey; частная Дата созданияДата; // добавлен частная строка newField; // ... другие новые поля } Поскольку мне нужно, чтобы существующее репозиторий работал без изменений, я подумал, что, возможно, мне удастся обойтись явным добавлением фильтра с помощью @Query в существующий репозиторий, например
общедоступный интерфейс FooRepo расширяет MongoRepository { // добавляем сюда явный @Query, чтобы добавить этот дополнительный фильтр @Query("{ businessKey: ?0, newField: { $exists: false } }") Foo findTopByBusinessKeyOrderByCreatedDateAsc (String businessKey); } // репозиторий NewFoo общедоступный интерфейс NewFooRepo расширяет MongoRepository { // весь новый код использует это для определенных функций, которые зависят // на новых полях } Но, похоже, это не совсем работает для FooRepo, поскольку @Query, похоже, предназначен только для фильтрации, проецирования и сортировки, но не для установки ограничения на набор результатов (в моем случае для быть 1).
Является ли создание пользовательской реализации для FooRepo, требующей реализации множества методов вручную, единственным вариантом, если я воспользуюсь этим подходом? Это выполнимо, но болезненно.
Мне было интересно, есть ли какой-нибудь волшебный интерфейс, который я мог бы реализовать, чтобы я мог просто добавить в фильтр это дополнительное поле и даже не беспокоиться об аннотации @Query, возможно?
У меня есть существующий репозиторий mongo, в котором не используются аннотации @Query, например
// модель @Document(коллекция="фу") общественный класс Foo { частный строковый идентификатор; частная строка businessKey; частная Дата созданияДата; } // репозиторий общедоступный интерфейс FooRepo расширяет MongoRepository { Foo findTopByBusinessKeyOrderByCreatedDateAsc (String businessKey); } Но мне нужно расширить этот репозиторий (как другую версию этой модели), в котором появится еще одно поле, и мне нужно обрабатывать код, в котором эти поля заполнены по-другому. В модель добавлено больше полей, чем я описал здесь. Обратите внимание, что они оба записаны в одну и ту же коллекцию foo. Новый Foo выглядит так
@Document(коллекция="фу") общественный класс NewFoo { частный строковый идентификатор; частная строка businessKey; частная Дата созданияДата; // добавлен частная строка newField; // ... другие новые поля } Поскольку мне нужно, чтобы существующее репозиторий работал без изменений, я подумал, что, возможно, мне удастся обойтись явным добавлением фильтра с помощью @Query в существующий репозиторий, например
общедоступный интерфейс FooRepo расширяет MongoRepository { // добавляем сюда явный @Query, чтобы добавить этот дополнительный фильтр @Query("{ businessKey: ?0, newField: { $exists: false } }") Foo findTopByBusinessKeyOrderByCreatedDateAsc (String businessKey); } // репозиторий NewFoo общедоступный интерфейс NewFooRepo расширяет MongoRepository { // весь новый код использует это для определенных функций, которые зависят // на новых полях } Но, похоже, это не совсем работает для FooRepo, поскольку @Query, похоже, предназначен только для фильтрации, проецирования и сортировки, но не для установки ограничения на набор результатов (в моем случае для быть 1).
Является ли создание пользовательской реализации для FooRepo, требующей реализации множества методов вручную, единственным вариантом, если я воспользуюсь этим подходом? Это выполнимо, но болезненно.
Мне было интересно, есть ли какой-нибудь волшебный интерфейс, который я мог бы реализовать, чтобы я мог просто добавить в фильтр это дополнительное поле и даже не беспокоиться об аннотации @Query, возможно?
Мобильная версия