作者:baeldung
译者:Darren Luo
1. 概述
本文将关注在 Spring Data MongoDB 中构建不同类型的查询。
我们将查看使用Query和Criteria类查询 ducument、自动生成的查询方法、JSON 查询和 QueryDSL。
1.1. Maven 依赖
如果你希望使用 Spring Data MongoDB,你需要加入以下条目到你的pom.xml文件:
最新版本可以在这里找到。
2. Document 查询
使用 Spring Data 查询 MongoDB的一种常见方法是使用Query和Criteria类,它们非常接近原生操作。
2.1.is
这只是一个使用相等的 criterion,让我们看看它是如何工作的 。
在以下示例中,我们查找名为Eric的用户。
让我来看看我们的数据库:
现在让我们看一下查询代码:
该逻辑的返回值将如预期:
2.2. 正则表达式
正则表达式是一种更灵活、更强大的查询类型。这将使用 MongoDB $regex 创建一个返回对应字段符合该正则表达式的所有记录的 criterion。
它的工作方式类似于startingWith、endingWith操作,让我们查看一个例子。
我们现在正在查找 name 以A开头的所有用户。
这里是数据库的状态:
现在让我们创建查询:
运行,将返回两条记录:
这里是另一个快速示例,这次查找 name 以c结尾的所有用户:
结果将是:
2.3.lt和gt
这些运算符创建使用$lt(小于)运算符和$gt(大于)运算符的 criterion。
让我们快速看一个例子,我们正在查找 age 在20到50之间的所有用户。
数据库为:
查询代码为:
结果为 age 大于20小于50的所有用户:
2.4.sort
sort被用于指定结果的排序顺序。
以下示例返回按 age 升序排列的所有用户。
首先,这里是已有数据:
然后执行sort:
这是查询结果,漂亮的按 age 排序:
2.5.pageable
让我们查看一个使用分页的快速示例。
这里是数据库状态:
现在,查询逻辑将简单的请求一个大小为 2 的页面:
结果是如预期的 2 个 document:
3. 已生成的查询方法
让我们探讨一下 Spring Data 通常提供的更常见的查询类型,自动生成的查询方法名称。
问哦们唯一需要做的就是利用这些类型的查询在 repository 接口上声明方法:
3.1.findByX
我们将开始简单的通过探讨 findBy 类型的查询,在这种情况下,按 name 查找:
与之前 2.1 节中的一样,查询将具有相同的结果,查找具有给定 name 的所有用户:
3.2.startingWith和endingWith
在2.2中,我们探讨了基于正则表达式的查询。starts 和 ends 当然没那么强大,但是非常有用,特别是如果我们不必实际实现它们。
这里是一个操作如何展示的快速示例:
当然,实际使用它的例子非常简单:
结果完全一样。
3.3.between
和2.3类似,这将返回 age 在ageGT和ageLT之间的所有用户:
调用方法将导致找到完全相同的 document:
3.4.like和orderBy
这次让我们查看更高级的示例,为生成的查询组合两种修饰符。
我们将要查找 name 包含字母A的所有用户,并且我们还按 age 升序排列结果:
对于我们在2.4中使用的数据库,结果将是:
4. JSON 查询方法
如果我们不能在方法名或 criteria 的帮助下表示查询,我们可以做更低级的事情,使用 @Query 注解。
使用此注解,我们可以指定原始查询,作为 Mongo JSON 查询字符串。
4.1. findBy
首先让我们开始简单查看我们将如何表示一个 find by 类型的方法:
此方法应按 name 返回用户,占位符?0引用方法的第一个参数。
4.2.$regex
让我们看看正则表示是驱动的查询,当然,将产生和2.2以及3.2相同的结果:
用法也完全相同:
4.3.$lt和$gt
现在让我们实现lt和gt查询:
然而现在该方法有2个参数,我们通过原始查询中的?0和?1索引引用每个参数。
5. QueryDSL 查询
MongoRepository对 QueryDSL 项目有很好的支持,所以我们可以利用这个不错的、类型安全的 API。
5.1. Maven 依赖
首先,让我们确保我们在 pom 中定义了正确的依赖:
5.2.Q-classes
QueryDSL 使用 Q-classes 创建查询。但是,由于我们并不希望手动创建这些,我们需要以某种方式生成它们。
我们将使用 apt-maven-plugin 来做到这一点:
让我们查看User类,特别关注@QueryEntity注解:
在运行 Maven 生命周期的process目标(或在这之后的任何其他目标)后,apt 插件在target/generated-sources/java/下将生成新类:
在这个类的帮助下,我们不用再创建我们的查询。
稍微说一下,如果你正在使用 Eclipse,引入此插件将在 pom 生成以下警告:
Maveninstall工作正常并且生成了QUser类,但是插件在 pom 中高亮显示。
快速解决方案是在eclipse.ini中手动指定 JDK:
5.3.新的 repository
现在我们需要在我们的 repositories 中实际启用 QueryDSL 支持,这可以简单的通过继承 QueryDslPredicateExecutor 接口来完成:
5.4.eq
支持启用后,现在让我们实现与之前举例相同的查询。
我们将从简单的相等开始:
5.5.startingWith和endingWith
同样,让我们实现之前的查询,并找到 name 以A开头的所有用户:
以c结尾的:
结果和2.2、3.2或4.2相同。
5.6.between
下一个查询将返回 age 在20到50之间的用户,和前面章节的一样:
6. 总结
在本文中,我们探讨了许多使用 Spring Data MongoDB 进行查询的方法。
有趣的是,让我们退一步看看有多少强大的方法来查询 MongoDB,从受限的控制一直到利用原始查询的完全控制。
所有这些示例和代码片段的实现都可以在 Github 项目中找到,这是一个基于 Eclipse 的项目,因此它应该很容易导入并运行。
spring4all.com感谢有你
领取专属 10元无门槛券
私享最新 技术干货