Добрый день!
Думаю, что вопрос сформулирован некорректно или возможно, я его недопонял.
Итак, насколько я вас понял, то вы хотите
обновить
существующую запись на основе данных, которые прибежали из контроллера в виде DTO.
Во-первых, в данном случае стоит использовать PutMapping (full updates) или PatchMapping (partial updates)
Читаем подробно тут:
https://www.baeldung.com/http-put-patch-difference...
Во-вторых, после того, как вы получили DTO вам необходимо его замаппить в Entity и обновить в БД. Однако, могут быть поля, которые не были заполнены в DTO и вы не хотите, чтобы они были применены, как null, так?
Далее конвертирую в entity, но откуда мне взять значения тех полей, которых не было в запросе?
Вам не нужно дозаполнять поля сконвертированного entity. Вам необходимо:
1) найти этот entity по идентификатору.
2) Если не хотите, чтобы null поля были применены к сущности, то при маппинге (см. ниже) сделать null check и если поле DTO null, то не сеттить его к сущности.
3) сохранить сущность.
Что касается маппинга:
1) Вы можете использовать интерфейс
Converter<S, T>
. И для каждого из полей сделать проверку типа (псевдокод):
if (fieldValue != null) { entity.setField(fieldValue); }
2) Если вы используете какую-либо библиотеку для маппинга (modelMapper, MapStruct и др.), то используйте возможности либы. Например, для modelMapper:
modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
https://stackoverflow.com/questions/45451025/how-t...
Также прокомментирую ваши комментарии из другого ответа:
вот мне интересно, как решается этот вопрос. Разве это нормально, что на каждый пришедший запрос к сервису приходится ходить к базе данных? И это без учета логики!
Можно настроить кеширование и тогда, обращения к БД не будет.
Это базовая ситуация, с которой сталкивается каждый. Допустим у меня entity Person с атрибутом даты рождения, которую я не хочу отображать в PersonDto. Когда пользователь пришлем мне PersonDto по API для, допустим, операции обновления, то как мне при конвертации в entity вернуть эту дату рождения, чтобы я мог сохранить новую сущность?
Обратите внимание на то, что может быть несколько DTO.
Например,
PersonCreationRequest - dto, которое заполняется из фронта при создании юзера
PersonCreationResponse - dto, которое заполняется из бекенда после создания юзера
PersonUpdatingRequest - dto, которое заполняется из фронта при обновлении юзера
PersonUpdatingResponse - dto, которое заполняется из бекенда после обновления юзера
PersonDto - общее dto, которое заполняется из бекенда для других нужд.
Могут быть и другие DTO...
Соответственно, ответ на ваш вопрос - используйте разные DTO.
Не знаю насколько точно смог ответить на ваш вопрос.