Получить по ключу вложенного документа, приложение Spring Hibernate MongoDB - PullRequest
0 голосов
/ 30 октября 2018

Я получил следующую сущность:

@Entity
@Document(collection = "devices")
public class Device {

    @Id
    private Long id;

    @ElementCollection
    @Column(name = "basic_info")
    private Map<String, String> basicInfo;

// getters, setters

и следующий код хранилища:

@Repository
public interface DeviceRepository extends MongoRepository<Device, Long> {

    List<Device> findByBasicInfo_Name(String name);

и документ выглядит так:

"id": 1,
"basicInfo": {
    "created": "timestamp",
    "name": "string",
    "type": "string",
    "status": "string"
}

Я пытаюсь получить документ на основе ключа "name" в "basicInfo" с помощью функции findByBasicInfo_Name, я даже пытался с помощью findByBasicInfoName, как кто-то предложил в другом потоке, но безуспешно. Я получаю следующую ошибку:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property name found for type String! Traversed path: Device.basicInfo.

1 Ответ

0 голосов
/ 30 октября 2018

Вам необходимо создать собственный репозиторий и реализовать его с помощью mongoTemplate.

@Repository
public interface DeviceRepository extends MongoRepository<Device, String>, DeviceRepositoryCustom {} 

Создайте пользовательский интерфейс репо и объявите один метод findByMapKey

public interface DeviceRepositoryCustom {

  List<Device> findByMapKey(String mapKey,String value, Class clazz);
}

Реализация интерфейса.

  public class DeviceRepositoryImpl implements  DeviceRepositoryCustom {

      @Autowired
      private final MongoTemplate mongoTemplate;

      @Override
      public List<Device> findByMapKey(String mapKey,String value, Class clazz) {

      Query query = Query.query(Criteria.where("basicInfo."+mapId).is(value));

       return mongoTemplate.find(query,clazz);
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...