MongoDB - FindById 不工作并给出 null

MongoDB - FindById is not working and giving null

我正在使用 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);

似乎有两个问题

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

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

将输入文档与 _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 interface extends CrudRepository and exposes the capabilities of the underlying persistence technology in addition to the generic persistence technology-agnostic interfaces such as 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!");
}

我也遇到了这个问题。有趣的是,2.1.7RELEASE

版本运行良好

<documentRepository>.findById(<StringID>) 在 2.2.2RELEASE 中被视为 String Id 而 2.1.7RELEASE 将其转换为 ObjectId,因此查找查询有效。