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);
似乎有两个问题
- 应该使用ObjectId
employeeRepository.findById(new ObjectId("5cb825e566135255e0bf38a4"))
- 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,因此查找查询有效。
我正在使用 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);
似乎有两个问题
- 应该使用ObjectId
employeeRepository.findById(new ObjectId("5cb825e566135255e0bf38a4"))
- 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,因此查找查询有效。