【问题标题】:MongoDB - FindById is not working and giving nullMongoDB - FindById 不起作用并给出 null
【发布时间】:2020-02-02 07:03:08
【问题描述】:

我正在使用 Spring Boot(V2.2.2.RELEASE) + Spring Data Mongo 示例。在这个例子中,我有如下记录

{
    "_id" : ObjectId("5cb825e566135255e0bf38a4"),
    "firstName" : "John",
    "lastName": "Doe"
}

我的仓库

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, ObjectId>{
    Employee findById(String id);
}

代码

Employee findById = employeeRepository.findById("5cb825e566135255e0bf38a4");
System.out.println(findById);

即使下面的代码也不起作用

Query query = new Query(Criteria.where("id").is(new ObjectId("5cb825e566135255e0bf38a4")));
List<Employee> find = mongoTemplate.find(query, Employee.class);

【问题讨论】:

    标签: mongodb spring-boot spring-data-mongodb


    【解决方案1】:

    好像有两个问题

    1. 应该使用ObjectId
    employeeRepository.findById(new ObjectId("5cb825e566135255e0bf38a4")) 
    
    1. ID 字段带有下划线
    new Query(Criteria.where("_id").is(new ObjectId("5cb825e566135255e0bf38a4")))
    

    我不是 Java 人,所以可能会错过,但至少试一试吧 :)

    【讨论】:

    • 这仍然不起作用..请在这里提出问题
    • 我发现@Id private String id被标记为@Field的错误,因此产生了问题。
    【解决方案2】:

    使用带有_id: ObjectId("5cb825e566135255e0bf38a4") 的输入文档,您可以使用任何一种方法。假设employee 集合中有文档,您可以通过_id 的字符串值进行查询。

    public class Employee {
         @Id
         private String id;
         private String name;
    
        // constructors (with and with arguments)
        // get methods
        // override toString()
    }
    
    // Spring-data app using MongoTemplate
    MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "test");
    Query query = new Query(where("id").is("5cb825e566135255e0bf38a4"));
    Employee emp = mongoOps.findOne(query, Employee.class);
    

    -或-

    MongoRepository 接口扩展了 CrudRepository 并公开了 除了通用的基础持久性技术 与持久性技术无关的接口,例如 CrudRepository。

    @Repository
    public interface EmployeeRepository extends MongoRepository<Employee, String> {
        @Query("{ 'id' : ?0 }")
        Optional<Employee> findById(String id);
    }
    
    // Spring-data app using the Repository
    Optional<Employee> empOpt = employeeRepository.findById("5cb825e566135255e0bf38a4");
    
    if (empOpt.isPresent()) {
        System.out.println(empOpt.get());
    }
    else {
       System.out.println("Employee not found!");
    }
    

    【讨论】:

    【解决方案3】:

    我也遇到过这个问题。有趣的是,2.1.7RELEASE 版本运行良好

    &lt;documentRepository&gt;.findById(&lt;StringID&gt;) 在 2.2.2RELEASE 中被视为字符串 ID 而 2.1.7RELEASE 将其转换为 ObjectId,因此查找查询有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      相关资源
      最近更新 更多