使用 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 的异常