【问题标题】:Creating a complex query using QueryDSL and MongoDB in Java在 Java 中使用 QueryDSL 和 MongoDB 创建复杂查询
【发布时间】:2012-05-29 16:17:31
【问题描述】:

我已经按照本教程设置了 MongoDB

http://www.littlelostmanuals.com/2011/09/spring-mongodb-type-safe-queries.html

一切都按预期工作,但现在我被困在我希望能够查询多个字段的地步。

目前,我保存的每种类型都有存储库接口,并且可以在单个字段上进行搜索。

public interface StartedEventRepository extends 
    MongoRepository<DatablockStartedEvent, String>,
    QueryDslPredicateExecutor<DatablockStartedEvent> { 

}

下面是单个参数的查询。

        return startedEventRepo
            .findOne(QDatablockStartedEvent.datablockStartedEvent.searchId
                    .eq(searchId));

是否可以创建一个查询对象,我可以在其中说类似于以下内容。

if(someName != null){
    query.where(QMyClass.name.eq(someName));
}
if(someTime != null){
    query.where(QMyClass.time.eq(someTime));
}

List result = query.list();

我已尝试查看 MongodbQuery,但无法使其正常工作。有任何想法吗?

我看到了一个示例 http://www.mkyong.com/mongodb/spring-data-mongodb-update-document/,但这使用了 mongoTemplate。有没有办法通过存储库来实现这一点,如果没有,它们就没用了吗?

【问题讨论】:

    标签: java mongodb spring-data querydsl


    【解决方案1】:

    应该是可以的。可能是这样的

    BooleanBuilder builder = new BooleanBuilder();
    
    if(someName != null){
        builder.and(QMyClass.name.eq(someName));
    }
    if(someTime != null){
        builder.and(QMyClass.time.eq(someTime));
    }
    
    repository.findAll(builder.getValue())
    

    【讨论】:

    • 这完全符合我的要求。为什么我要花这么多时间来处理 MongodbQuery 和它需要的所有愚蠢的类。非常感谢。
    • com.mysema.query.mongodb.MongodbQuery 是一个低级查询类,应该通过高级适配器使用,无论是来自 Spring Data 还是通过 Querydsl Morphia 支持
    • 谢谢,我将不得不更详细地阅读它。这是我第一次使用 mongo 和 spring 数据,所以我还在学习。在此之前,我只是使用 MyBatis 和 Hibernate。
    • 改进:您可以简单地将 'builder' 传递给 repository.findAll 方法,而不是 builder.getValue(),因为 BooleanBuilder 实现了 com.querydsl.core.types.Predicate。
    【解决方案2】:

    在没有使用过 Spring Data 的情况下,我从阅读此http://static.springsource.org/spring-data/data-document/docs/1.0.0.M2/reference/html/#mongodb.repositories.queries 中猜测您只需在存储库中声明一个方法,其中方法名称告诉您的查询结构(此猜测在同一站点上的示例 4.3 中得到支持)。不确定是否可以生成动态查询,这是唯一一个快速搜索显示的查询。

    【讨论】:

    • 我试过了,效果很好,但它要求密钥始终存在。例如,如果我添加 findBy(String id, String loginId, String searchId) 那么我必须始终提供字段 id 否则它将引发空指针异常。可以在不提供 id 字段的情况下直接搜索,所以我很惊讶地发现它不起作用。几乎正是我想要的。我必须先做更多的调查,今天才谈到它。
    • 刚刚通过重新排列参数进行了测试。所以我确实 findBy(String loginId, String id, String searchId) 现在需要我提供 loginId,因此我必须始终提供第一个参数。不太符合我的需要。
    • 很抱歉无法为您提供更多帮助,只是总结了快速浏览文档后发现的内容。
    猜你喜欢
    • 2013-07-07
    • 2013-11-07
    • 2023-04-11
    • 2014-10-15
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多