【问题标题】:Retrieve data from MongoDB using spring data findAll(Example<S> example)使用 spring data findAll(Example<S> example) 从 MongoDB 中检索数据
【发布时间】:2016-11-16 02:21:36
【问题描述】:

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

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

注意:我尝试在 sn-p 下方添加和删除 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();
}

下面是UML类:

【问题讨论】:

  • 你试过findByDeletedIsFalse()吗?
  • 感谢您的快速回复。但是,我不确定您的建议是什么?我没有看到任何像你提到的那样被 org.springframework.data.mongodb.repository.MongoRepository 公开的方法。你能解释一下吗?
  • 阅读文档。只需在您的AdnsRepository定义该方法,它就会为您神奇地创建。
  • 哇。太棒了。工作就像一个魅力。非常感谢@chrylis。

标签: java spring mongodb spring-data spring-data-mongodb


【解决方案1】:

您需要在您的存储库接口上创建方法声明findByDeletedIsFalse

在运行时,sp​​ring data 会自动找到这个接口并为其创建一个实现。这实际上是 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();
}

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

【讨论】:

    【解决方案2】:

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

    没有办法在未设置此类属性的情况下实例化该对象。这是因为原语始终采用默认值(布尔值为 false)并且不能分配为 null。 因此,如果您打算按任何其他字段进行搜索,则使用该探针进行的任何示例搜索都可能最终产生不希望的副作用:示例中将始终包含原始字段(及其默认值“false”)。

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

    withMatcher("deleted", exact());
    

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

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2021-10-18
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 2013-06-21
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多