MongoDB使用alike条件查询无结果或报MongoPersistentEntity must not be null错误
问题原因分析
- 第一种写法无返回结果的原因
你使用的是Spring Data MongoDB的QBE(按示例查询)能力,Example.of(order)默认会匹配Order对象中所有非null字段作为查询条件:如果Order类中存在除paymentType外的其他基本类型字段(如int、long、boolean等),这类字段会被初始化为0、false等非null默认值,会被自动加入查询条件,导致和库中数据不匹配;此外也可能是字段类型不匹配,比如库中paymentType存储为数值类型,你代码中传入的是字符串"1",类型不一致无法匹配。 - 第二种写法报错的原因
alike()方法是QBE体系中专门用于接收完整实体类Example对象的API,你传入的是字符串类型的Example.of("1"),Spring Data MongoDB无法找到字符串类型对应的Mongo持久化实体元数据,因此抛出MongoPersistentEntity must not be null异常,该方法不支持针对单个字段传入普通类型的Example。
解决方案
方案1:仅查询单个字段,直接使用普通查询(最推荐)
单字段查询没必要使用QBE,直接使用字段匹配API即可:
// 如果库中paymentType是数值类型,改为is(1) Query query = new Query(Criteria.where("paymentType").is("1")); List<Order> orders = mongoTemplate.find(query, Order.class);
方案2:仍需使用QBE的场景,自定义ExampleMatcher
如果是多字段组合查询需要用QBE,可通过ExampleMatcher指定仅匹配需要的字段,忽略其他无关字段:
Order order = new Order(); order.setPaymentType("1"); // 配置匹配规则:仅匹配paymentType字段,忽略其他所有字段 ExampleMatcher matcher = ExampleMatcher.matching() .withIncludePaths("paymentType"); Example<Order> example = Example.of(order, matcher); Query query = new Query(Criteria.byExample(example)); List<Order> orders = mongoTemplate.find(query, Order.class);
内容的提问来源于stack exchange,提问作者muhammed ozbilici
相关产品推荐
相关产品推荐

