2015-05-08 2 views
12

У меня есть следующее POJO.Запрос хранилища с параметром List в Spring Data MongoDB

@Document(collection = "questions") 
public class Question { 

    @Id 
    private String id; 

    public List<String> getTags() { 
     return tags; 
    } 

    public void setTags(List<String> tags) { 
     this.tags = tags; 
    } 
} 

Я пытаюсь реализовать MongoRepository запрос, который находит все Question S, которые содержат список тегов. Я попытался следующие:

@Repository 
public interface QuestionRepository extends MongoRepository<Question, String> { 
    List<Question> findByTags(List<String> tags); 
} 

, но это работает только когда List тегов, которые я передаю методу полностью совпадает со списком тегов, назначенных на вопрос в Монго. Например. если у меня есть вопрос в Mongo со списком тегов [ "t1", "t2", "t3" ], то я не получаю findByTags(List) при передаче [ "t1", "t2" ] методу.

Я попытался следующие, а также:

@Repository 
public interface QuestionRepository extends MongoRepository<Question, String> { 
    @Query("{ tags: { $all: ?0 } }") 
    List<Question> findByTags(List<String> tags); 
} 

, но тогда мой war не может быть развернут на мой контейнер сервлетов вообще. (Я получаю следующее сообщение об ошибке в этом случае:

The web application [backend] appears to have started a thread named [cluster-1-db:27017] but has failed to stop it. This is very likely to create a memory leak. 

могли бы вы посоветовать, как реализовать этот пользовательский запрос

ответ

21

Я отвечу на свой вопрос, как я только что нашел ответ сам? Существуют. следующий раздел в документации Spring Data MongoDB перечислены все поддерживаемые ключевые слова, которые используются Spring для его вывода запроса:

http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repository-query-keywords

следующая реализация работает для случая использования описанных выше:

@Repository 
public interface QuestionRepository extends MongoRepository<Question, String> { 
    List<Question> findByTagsIn(List<String> tags); 
} 
+2

приятный поиск. должно ли ключевое слово быть в конце имени метода? спасибо – Harshana

+1

Что делать, если мы хотим найти вопросы, имеющие хотя бы 1 тег? без знания тега? –

+1

получил! @Query ("{tags: {$ exists: true}, $ where: 'this.tags.length> 0'}") –

1

Содержащее ключевым слово также может быть использовано:

@Repository 
public interface QuestionRepository extends MongoRepository<Question, String> { 
    List<Question> findByTagsContaining(List<String> tags); 
} 

примера и как это Монго запрос выглядит следующим образом:

findByAddressesContaining(Address address) 

{"addresses" : { "$in" : address}} 

Это может также принять список адреса в Params.

См. Документацию: https://github.com/spring-projects/spring-data-mongodb/blob/e28bede416e4ddac19a35dc239388afc90b9cac4/src/main/asciidoc/reference/mongo-repositories.adoc

Смежные вопросы