MongoRepository动态查询

2024-06-19

我有以下问题。假设我有以下模型对象:

class Person {
    String id;
    String firstName;
    String lastName;
    Map<String, String> properties;
}

在属性映射中,您可以插入任何类型的属性,没有任何限制。

上面的对象保存在 MongoDB 中,如下所示:

public interface PersonRepo extends MongoRepository<Person, String> {
}

当一个人被保存到存储库中时Map<String, String> properties被压平了。举个例子,如果我们有以下对象:

Person: {
    id := 1;
    firstName := John,
    lastName  := Doe,
    properties := {
        age: 42
    }
}

保存在 MongoRepository 中的文档如下:

Person: {
    id := 1;
    firstName := John,
    lastName  := Doe,
    age := 42
}

现在我的问题是,我必须根据(例如)寻找对象,如果它们具有特定的属性或没有。假设我想要所有已定义年龄属性的人。一个重要的附加要求是我应该返回一份分页结果.

我尝试过使用

findAll(Example<Person> example, Pageable pageable)

但由于某种原因这不起作用。我怀疑我的模型对象和 MongoDB 文档具有不同的结构。

我也尝试过使用 QueryDsl (这里有一个例子:http://www.baeldung.com/queries-in-spring-data-mongodb http://www.baeldung.com/queries-in-spring-data-mongodb)但也没有成功,而且对我来说这个解决方案并不优雅(必须维护生成的类等。而且我有一种感觉它不会工作,因为我Map<String, String> properties对象成员)。

我想到的另一个足够优雅的解决方案是具有以下功能:

@Query(value = "?0")
Page<Query> findByQuery(String query, Pageable pageable)

在这种情况下,我将能够手动构建查询,并且不必对运行搜索的密钥进行硬编码。 我现在的问题是,如何将查询值设置为我的第一个参数?通过上面显示的示例,我收到以下错误

java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb.DBObject

另一种解决方案是使用mongoTemplate并查询给定一些Criteria如以下示例所示:

    final Query query = new Query();
    query.addCriteria(Criteria.where("age").regex(".*"));

    mongoTemplate. find(query, Person.class);

此解决方案的问题在于它返回对象列表而不是分页结果。如果我添加,它还会返回特定页面query.with(new PageRequest(3, 2));但在这种情况下,我无法手动构造“分页”结果,因为我不知道元素的总数。

您还有其他想法可以帮助我吗?

提前致谢!


贝娄是我想出的解决方案。回顾一下,我遇到的问题是,我无法执行给定查询对象作为输入的查询,以提高过滤条件的灵活性。事实证明,解决方案非常简单,我只需仔细阅读文档即可:)。

  1. step

扩展 MongoRepository 并添加您的自定义函数:

@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {

    Page<T> findAll(Query query, Pageable pageable);
}
  1. step

创建该接口的实现:

public class ResourceRepositoryImpl<T, I extends Serializable> extends SimpleMongoRepository<T, I> implements ResourceRepository<T, I> {

    private MongoOperations mongoOperations;
    private MongoEntityInformation entityInformation;

    public ResourceRepositoryImpl(final MongoEntityInformation entityInformation, final MongoOperations mongoOperations) {
        super(entityInformation, mongoOperations);

        this.entityInformation = entityInformation;
        this.mongoOperations = mongoOperations;
    }

    @Override
    public Page<T> findAll(final Query query, final Pageable pageable) {
        Assert.notNull(query, "Query must not be null!");

        return new PageImpl<T>(
                mongoOperations.find(query.with(pageable), entityInformation.getJavaType(), entityInformation.getCollectionName()),
                pageable,
                mongoOperations.count(query, entityInformation.getJavaType(), entityInformation.getCollectionName())
        );
    }
}
  1. step

将您的实现设置为默认的 MongoRepository 实现:

@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
    public static void main(final String[] args) {
        SpringApplication.run(MySpringApplication.class, args);
    }
}
  1. step

为您的自定义对象创建存储库:

public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}

现在,如果您想将多个对象保存在 mongo 文档存储中,那么定义一个扩展您的接口就足够了ResourceRepository(如步骤 4 所示),您将可以使用Page<T> findAll(Query query, Pageable pageable)自定义查询方法。我发现这个解决方案是我尝试过的最优雅的解决方案。

如果您有任何改进建议,请与社区分享。

问候, 克里斯蒂安

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoRepository动态查询 的相关文章

随机推荐

  • sql查询获取从一月到当月的所有数据,即使没有记录

    我不擅长 sql 所以任何帮助世界都很棒 我有一个 SQL 查询 可以获取从一月到当月注册的记录 我的代码示例 SELECT DatePart YEAR p createStamp as TheYear DatePart MONTH p c
  • 如何在Flutter中获取ScrollView中的子滚动偏移位置

    我制作了一个 CustomScrollView 小部件 其中包含 银应用栏 Sliver持久标头 银格 Sliver持久标头 银格 SliverPercientHeader 将是 SliverGrid 中项目的描述 一旦点击 我用 Gest
  • 如何在 Google Compute Engine 上创建的两个实例之间进行 ssh?

    我在 Google Compute Engine 上创建了两个实例 Instance A hostname robot a ip addr 10 111 0 11 Instance B hostname robot b ip addr 10
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • SL4 AutoCompleteBox 重复筛选结果问题

    我在 AutoCompleteBox 过滤方面遇到问题 它似乎记住了之前的过滤器 例如 我输入 A 它会返回 1 项 我删除 A 并输入 Z 这应该返回 1 项 问题是它返回 A 过滤器加上 Z 的结果 我删除 Z 并输入 S 这会带回 2
  • 如何为 HTML5 音频元素制作加载栏?

    我正在尝试为 HTML5 音频元素制作一个加载栏 显示加载 缓冲的百分比 对于视频标签 可以使用以下方法进行计算 video buffered end 0 video duration 但我无法让它与音频标签一起使用 它只是返回一个固定值
  • jQuery 验证日期范围问题

    我的代码中有很多地方有成对的相关开始和结束日期字段 范围 我需要验证开始日期早于结束日期 我正在使用 jQuery 验证插件 这是我的代码 http jsfiddle net jinglesthula dESz2 http jsfiddle
  • 在 PlayFramework 2 / Ebean ORM 中使用 @OneToOne,其中子级和父级共享相同的主键

    有两种型号 模型 User java Entity Table name users public class User extends Model Id public int user id public String firstName
  • 在 django 中处理图像上传表单:何时使用 save()、chunks() 和 clean_data?

    我已经使用以下代码成功上传了图像 views py from django conf urls defaults import from django http import HttpResponse HttpResponseRedirec
  • 如何向 vue 项目添加 Babel 对 nullish Coalescing Operator 的支持?

    在我的 Vue CLI 项目中 当我尝试使用 操作员 我收到此错误 语法错误 SyntaxError Users stevebennett odev freelancing v map src components Map vue gt 当
  • IE MIME/内容过滤

    我正在研究开发 IE6 扩展的方法 该扩展将允许处理自定义 MIME 类型 举个例子 我需要能够获取服务器返回的具有自定义 MIME 类型的文档 对其执行一些处理 然后将 MIME 类型更改回 IE 可以本机处理的类型 例如 text ht
  • 如何使用 Android 处理在 Google Cardboard 设备中显示立体图像?

    处理的目的是使使用 Java 绘图变得更加容易 Android 的处理功能具有桌面版的强大功能以及来自传感器的信息 将这些东西放在一起 显示立体图像并像 Oculus Rift 或 Google Cardboard 一样在其周围移动不是很容
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • 为什么需要设置WORKON_HOME环境变量?

    我已经有一段时间没有使用 python 虚拟环境了 但我也安装了虚拟环境包装器 我的问题是 在文档页面中它说要这样做 export WORKON HOME Envs mkdir p WORKON HOME source usr local
  • C 中的变量定义是什么意思[重复]

    这个问题在这里已经有答案了 你们能告诉我 这在 C 中意味着什么吗 define Privileged Data Privileged Data static int dVariable 编译器对变量进行寻址有特殊意义吗 这只是一个宏Pri
  • 如何在 UITableView 中显示零行的表格

    我正在动态地将内容加载到 UITableView 中 如果有数据 表格需要显示数据 如果没有数据 表格应显示普通页面 但在我的应用程序中 表格显示带有两条分隔线的普通页面 我需要删除此分隔线并显示纯白色页面 请建议 任何帮助 将不胜感激 如
  • MongoRepository动态查询

    我有以下问题 假设我有以下模型对象 class Person String id String firstName String lastName Map