2015-05-08 13 views
12

Ich habe die folgenden POJO.Repository-Abfrage mit einem List-Parameter in 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; 
    } 
} 

Ich versuche, eine MongoRepository Abfrage zu implementieren, die alle Question s findet, die eine Liste von Tags enthalten. Ich habe folgendes versucht:

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

aber dies ist nur funktioniert, wenn die List von Tags, die ich auf das Verfahren vollständig die Liste der Tags auf die Frage in Mongo zugewiesen passt vorbei bin. Z.B. Wenn ich eine Frage in Mongo mit einer Liste von Tags [ "t1", "t2", "t3" ] habe, wird es nicht von findByTags(List) zurückgegeben, wenn ich [ "t1", "t2" ] an die Methode übergebe.

Ich habe versucht, die folgenden auch:

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

aber dann konnte mein war gar nicht zu meinem Servlet-Container eingesetzt werden. (Ich erhalte die folgenden Fehler in diesem Fall:

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. 

Würden Sie bitte auf, wie die benutzerdefinierte Abfrage implementieren

Antwort

21

Ich werde meine eigene Frage beantworten, wie ich nur die Antwort von mir gefunden Die?. Abschnitt folgt im Spring Data MongoDB Dokumentation listet alle unterstützten Schlüsselwörter, die für die Abfrage Ableitung von Spring verwendet:

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

die folgende Implementierung für den Anwendungsfall arbeitet oben beschrieben:

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

nice finding. Soll das Schlüsselwort am Ende des Methodennamens stehen? danke – Harshana

+1

Was, wenn wir Fragen finden wollen, die mindestens 1 Umbau haben? ohne Wissen Tag? –

+1

hab es !! @Query ("{tags: {$ exists: true}, $ wo: 'this.tags.length> 0'}") –

1

Das ENTHALTEN Schlüsselwort kann auch verwendet werden:

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

Beispiel und wie es Mongo Abfrage wie folgt aussieht:

findByAddressesContaining(Address address) 

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

Dies kann auch in params Liste der Adresse akzeptieren.

Siehe Dokumentation: https://github.com/spring-projects/spring-data-mongodb/blob/e28bede416e4ddac19a35dc239388afc90b9cac4/src/main/asciidoc/reference/mongo-repositories.adoc

Verwandte Themen