MongoDB - FindById не работает и дает ноль - PullRequest
0 голосов
/ 02 февраля 2020

Я использую Spring Boot (V2.2.2.RELEASE) + Spring Data Mon go Пример. В этом примере у меня есть записи вроде ниже

{
    "_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);

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Используя входной документ с _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 и предоставляет возможности базовой технологии персистентности в дополнение к универсальным интерфейсам с технологией постоянства c, таким как 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!");
}
0 голосов
/ 02 мая 2020

Я тоже столкнулся с проблемой. Интересно, что с версией 2.1.7RELEASE

<documentRepository>.findById(<StringID>) все работает нормально как String Id в 2.2.2RELEASE, в то время как 2.1.7RELEASE преобразует его в ObjectId, поэтому запрос поиска работает.

0 голосов
/ 02 февраля 2020

Кажется, может быть две проблемы

  1. Должен использоваться ObjectId
employeeRepository.findById(new ObjectId("5cb825e566135255e0bf38a4")) 
Поле идентификатора идет с подчеркиванием
new Query(Criteria.where("_id").is(new ObjectId("5cb825e566135255e0bf38a4")))

Я не Java парень, поэтому могу пропустить что-то, но, по крайней мере, попробовать это :)

...