我有一个Java应用程序,它使用Spring数据从mongo DB中检索数据。我有一个案例,其中我想从mongo集合中检索所有对象,其中isDeleted标志设置为false 。
我尝试使用org.springframework.data.domain.ExampleMatcher,如https://github.com/spring-projects/spring-data-examples/tree/master/mongodb/query-by-example中所述,但它不起作用(返回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();
}
答案 0 :(得分:1)
您需要在存储库界面上创建方法声明findByDeletedIsFalse
。
在运行时,spring数据将找到此接口并自动为其创建实现。这实际上是弹簧数据的关键特征之一。您可以阅读有关query methods in the docs的更多信息。春季文档非常容易阅读并且充满了例子。
假设您的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();
}
有关查询方法生成的更多信息:
答案 1 :(得分:0)
如果您的Probe对象(在这种情况下为Adns)具有诸如boolean之类的原始类型,则在使用示例匹配器时要小心。
无法实例化未设置此类属性的对象。这是因为基元始终采用默认值(对于布尔值,则为false),并且不能将其分配为null。 因此,如果您打算通过任何其他字段进行搜索,则使用该探针的示例搜索可能最终会产生不希望的副作用:示例中将始终包含原始字段(默认字段为“ false”值)。
现在,关于您的问题,我建议您打印出探针对象的json表示形式(使用jackson的modelmapper这样做)以检测具有默认值的任何字段(例如,空字符串插入null值)。除此之外,您的字段在模型中称为已删除,因此正确的匹配项应为:
withMatcher("deleted", exact());
无论如何,总是最好在存储库中使用findBy ....方法并依靠spring-data-mongodb自动实现 希望能有所帮助。