使用 spring data findAll 从 MongoDB 中检索数据(Example<S> example)

Retrieve data from MongoDB using spring data findAll(Example<S> example)

我有一个 Java 应用程序,它使用 Spring 数据从 mongo 数据库检索数据。我有一个案例,我想从 mongo 集合中检索所有对象,其中 isDeleted 标志设置为 false .

我尝试按照 https://github.com/spring-projects/spring-data-examples/tree/master/mongodb/query-by-example 中的说明使用 org.springframework.data.domain.ExampleMatcher,但它不起作用(returns 0 条记录)。下面是我尝试的代码片段。

注意:我尝试在下面的代码片段中添加和删除 withIgnoreNullValues()。它没有帮助。

    public List<Adns> getAll(){
        Adns matcherObject = new Adns();
        matcherObject.setDeleted(false);
        ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues().
                                 withMatcher("isDeleted", exact());
        Example<Adns> example = Example.of(matcherObject,matcher);
        return adnsRepository.findAll(example);
    }

我能够在没有该布尔过滤器的情况下成功检索所有对象。下面是工作代码。

public List<Adns> getAll(){
    return adnsRepository.findAll();
}

下面是 class UML :

您需要在存储库界面上创建方法声明 findByDeletedIsFalse

在运行时,spring数据会自动找到这个接口并为它创建一个实现。这实际上是 spring-data 的主要特征之一。您可以阅读有关 query methods in the docs 的更多信息。 spring 文档非常易于阅读并且充满了示例。

假设您的 Adns 使用 Long 作为主要 ID,并且您使用的是基本 CrudRepository 提供商,您应该拥有:

public interface AdnsRepository extends CrudRepository<Adns, Long> {
    // this method declaration is automatically implemented by the spring-data library at runtime.
    List<Adns> findByDeletedIsFalse();
}

有关查询方法生成的更多信息:

如果您的 Probe 对象(在本例中为 Adns)具有基本类型(例如布尔值),则在使用示例匹配器时要小心。

无法实例化未设置此类属性的对象。这是因为基元总是采用默认值(对于布尔值是 false)并且不能分配给 null。 因此,如果您打算通过任何其他字段进行搜索,那么使用该探针的任何示例搜索都可能会产生不良副作用:原始字段将始终包含在示例中(具有默认 'false' 值)。

现在,关于你的问题,我建议你打印出探测对象的 json 表示(使用 jackson 的模型映射器来这样做)以检测任何采用默认值的字段(例如空字符串 insted空值)。除此之外,您的字段在模型中称为 deleted,因此正确的匹配器应该是:

withMatcher("deleted", exact());

无论如何,最好使用存储库中的 findBy.... 方法并依赖 spring-data-mongodb 自动实现 希望它有所帮助。