首页
学习
活动
专区
工具
TVP
发布

译:Spring Data MongoDB 中的查询指南

作者: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感谢有你

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180731B08GJ500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券