web-dev-qa-db-fra.com

Requête de référentiel avec un paramètre List dans Spring Data MongoDB

J'ai le POJO suivant.

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

J'essaie d'implémenter une requête MongoRepository qui trouve tous les Question qui contiennent une liste de balises. J'ai essayé ce qui suit:

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

mais cela ne fonctionne que lorsque le List des balises que je passe à la méthode correspond entièrement à la liste des balises affectées à la question dans Mongo. Par exemple. si j'ai une question dans Mongo avec une liste de balises [ "t1", "t2", "t3" ] elle n'est pas retournée par findByTags(List) lorsque je passe [ "t1", "t2" ] à la méthode.

J'ai également essayé ce qui suit:

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

mais alors mon war n'a pas pu être déployé du tout sur mon conteneur de servlet. (J'obtiens l'erreur suivante dans ce cas:

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.

Pourriez-vous nous conseiller sur la façon d'implémenter cette requête personnalisée?

24
Marchev

Je vais répondre à ma propre question car je viens de trouver la réponse par moi-même. La section suivante de la documentation Spring Data MongoDB répertorie tous les mots clés pris en charge utilisés par Spring pour sa dérivation de requête:

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

L'implémentation suivante fonctionne pour le cas d'utilisation décrit ci-dessus:

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

Le mot-clé CONTAINING peut également être utilisé:

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

exemple et à quoi ressemble la requête mongo:

findByAddressesContaining(Address address)

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

Cela peut également accepter la liste d'adresses dans les paramètres.

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

7
alegria