【问题标题】:Spring JPA: Query Annotation Fields select not working for Mongo QuerySpring JPA:查询注释字段选择不适用于 Mongo 查询
【发布时间】:2018-02-08 07:00:14
【问题描述】:

我有以下查询/投影,可用于从我的数据集中检索数据: db.library.find({ party_id: 'TEST_PARTY_ID', contract_id : 'TEST_CONTRACT_ID' }, { library_list: { $elemMatch: { book_code: 'TST_BOOK_CODE' } } }) 换句话说:通过party_id和contract_id查找所有文档,并返回library_list数组中书籍代码与'TST_BOOK_CODE'匹配的library_list元素。

我想将此查询添加到我的 Spring 存储库中,因此我创建了以下内容:

@Query(value="{party_id: ?0, contract_id : ?1}", fields="{'library_list': {$elemMatch: {'book_code': ?2}}}")
Library findLibraryByPartyAndContractAndBookCode(String partyId, String contractId, String bookCode);

这不起作用。我取回了一个文档,其中除了文档 ID 之外的所有内容都为空。但是,如果我删除“字段”属性,我会取回整个文档。看起来“值”选择器很好,但“字段”选择器有问题。 JPA 在这里不支持 $elemMatch 语法吗?根据 javadoc:"Both attributes allow using a placeholder notation of ?0, ?1 and so on",所以我认为这不是问题。

【问题讨论】:

  • 它对我有用。你可以在帖子中添加LibraryListLibrary pojo 吗?

标签: spring mongodb jpa


【解决方案1】:

我无法为直接解决方案设计一个修复程序,但是由于这个问题没有收到任何答复,我想我会为此发布我的解决方法。

我必须创建一个单独的存储库类并使用以下查询来构造选择和投影:

Query q = new Query().addCriteria(Criteria.where("party_id")
        .is(partyId)
    .and("contract_id").is(cardId));
q.fields()
    .elemMatch("library_list", Criteria.where("book_code").is(preferenceCode));

List<LibraryList> ret = mongoTemplate.find(q, LibraryList.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2021-07-14
    • 1970-01-01
    • 2013-05-20
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多