使用 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();
}
有关查询方法生成的更多信息:
- keywords: isFalse, isLike, isNotEmpty, etc
- the valid return types 可以从 spring 数据存储库查询方法返回。
如果您的 Probe 对象(在本例中为 Adns)具有基本类型(例如布尔值),则在使用示例匹配器时要小心。
无法实例化未设置此类属性的对象。这是因为基元总是采用默认值(对于布尔值是 false)并且不能分配给 null。
因此,如果您打算通过任何其他字段进行搜索,那么使用该探针的任何示例搜索都可能会产生不良副作用:原始字段将始终包含在示例中(具有默认 'false' 值)。
现在,关于你的问题,我建议你打印出探测对象的 json 表示(使用 jackson 的模型映射器来这样做)以检测任何采用默认值的字段(例如空字符串 insted空值)。除此之外,您的字段在模型中称为 deleted,因此正确的匹配器应该是:
withMatcher("deleted", exact());
无论如何,最好使用存储库中的 findBy.... 方法并依赖 spring-data-mongodb 自动实现
希望它有所帮助。
我有一个 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();
}
有关查询方法生成的更多信息:
- keywords: isFalse, isLike, isNotEmpty, etc
- the valid return types 可以从 spring 数据存储库查询方法返回。
如果您的 Probe 对象(在本例中为 Adns)具有基本类型(例如布尔值),则在使用示例匹配器时要小心。
无法实例化未设置此类属性的对象。这是因为基元总是采用默认值(对于布尔值是 false)并且不能分配给 null。 因此,如果您打算通过任何其他字段进行搜索,那么使用该探针的任何示例搜索都可能会产生不良副作用:原始字段将始终包含在示例中(具有默认 'false' 值)。
现在,关于你的问题,我建议你打印出探测对象的 json 表示(使用 jackson 的模型映射器来这样做)以检测任何采用默认值的字段(例如空字符串 insted空值)。除此之外,您的字段在模型中称为 deleted,因此正确的匹配器应该是:
withMatcher("deleted", exact());
无论如何,最好使用存储库中的 findBy.... 方法并依赖 spring-data-mongodb 自动实现 希望它有所帮助。