web-dev-qa-db-ja.com

Spring Data MongoDBのListパラメーターを使用したリポジトリクエリ

次のPOJOがあります。

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

タグのリストを含むすべてのMongoRepositorysを見つけるQuestionクエリを実装しようとしています。私は次を試しました:

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

しかし、これは、メソッドに渡すタグのListがMongoの質問に割り当てられたタグのリストと完全に一致する場合にのみ機能します。例えば。 Mongoでタグのリスト_[ "t1", "t2", "t3" ]_で質問がある場合、_[ "t1", "t2" ]_をメソッドに渡すときにfindByTags(List)によって返されません。

私も次のことを試しました:

_@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.
_

そのカスタムクエリを実装する方法についてアドバイスしてください。

24
Marchev

自分で答えを見つけたばかりなので、自分の質問に答えます。 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);
}
45
Marchev

CONTAININGキーワードも使用できます。

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

例とmongoクエリの様子:

findByAddressesContaining(Address address)

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

これは、paramsでアドレスのリストを受け入れることもできます。

ドキュメントを参照してください: https://github.com/spring-projects/spring-data-mongodb/blob/e28bede416e4ddac19a35dc239388afc90b9cac4/src/main/asciidoc/reference/mongo-repositories.adoc

7
alegria