使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef

Posted

技术标签:

【中文标题】使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef【英文标题】:Query DBRef with Spring Data MongoDB using QueryDSL 【发布时间】:2017-10-31 14:56:12 【问题描述】:

我正在使用 Spring Data MongoDB 和 QueryDSL 来执行一些简单的查询,但是我在尝试将谓词与 DBRef 对象的字段一起使用时遇到了问题。

似乎 DBRef 没有解析,所以查询总是返回空结果。从 2014 年开始,关于这个主题的问题主要有一些,尽管在 QueryDSL 和 Spring Data 方面似乎已经完成了一些工作,但我仍然无法使其工作,也没有找到任何工作示例。

我正在寻找一个简单的解决方案,如以下简化的测试用例:

@Document
class Foo 
    @Id Integer id;
    @DBref Bar bar;


@Document
class Bar 
    @Id Integer id;
    String name;


interface FooRepository extends MongoRepository<Foo, Integer>, QueryDslPredicateExecutor<Foo>  ... 

以及我尝试使用的查询:

fooRepository.findAll(QFoo.foo.bar.name.eq("test"))

我正在使用 QueryDSL 4.1.4、Spring Boot 1.5.3 和 Spring Data MongoDB 1.10.3

支持吗?我错过了什么吗?

【问题讨论】:

【参考方案1】:

TL;DR;

不支持。

说明

您正在表达一个谓词,该谓词跟随对不同文档的引用。

MongoDB 是一个不知道连接的面向文档的数据库。每个文档都可能包含子文档或参考资料(它们是人工的)。此外,必须单独查找每个文档或根据查询将每个文档作为文档集合获取。

由于 MongoDB 没有内置连接,因此您无法跨 DBRef 引用进行查询。您可以表达一个在嵌入子文档时扫描子文档的查询。

Spring Data MongoDB 以更加用户友好的方式公开了 MongoDB 提供的功能,并不假装提供 MongoDB 支持的功能。

从 MongoDB 3.4 开始,聚合框架支持$graphLookup 让 MongoDB 在聚合阶段查找单个文档。查找成本高昂,这是您希望避免的。

【讨论】:

除了$graphLookup还有别的方法吗?

以上是关于使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef的主要内容,如果未能解决你的问题,请参考以下文章

使用 QueryDSL 和 Spring 的存储库编写跨表查询

通过 REST 控制器使用 Spring Data JPA 和 QueryDsl 的异常

Spring 数据规范或 QueryDSL

Spring Data JPA - 规范和 Querydsl

通用代码因 Spring 数据和 Querydsl 而失败

将 Querydsl 与 Spring Data 一起使用时的最佳实践