У меня есть объект, который необходимо немного изменить, прежде чем он будет возвращен пользователю. Насколько я понимаю, лучший способ сделать это - использовать объект передачи данных.
Это работает нормально, но потом я добавил дочернюю сущность. Я снова создал DTO для дочерней сущности. Вот код для хранилища:
@Repository
public interface DrawingReleaseRepository extends CrudRepository<DrawingRelease, Integer> {
@Query("SELECT new com.engineering.dto.drawings.DrawingReleaseDTO("
+ "dwgrel.drawingReleaseID,"
+ "relType"
+ ") FROM DrawingRelease dwgrel "
+ "JOIN dwgrel.releaseType relType "
+ "WHERE dwgrel.drawingReleaseID = ?1")
DrawingReleaseDTO getDrawingRelease(int drawingReleaseID);
}
Конструктор для DrawingReleaseDTO это:
public DrawingReleaseDTO(int drawingReleaseID, DrawingReleaseType releaseType) {
this.drawingReleaseID = drawingReleaseID;
this.releaseType = new DrawingReleaseTypeDTO(releaseType);
}
На моем сервисном уровне я теперь могу манипулировать данными, которые возвращаются клиенту, но изменения не сохраняются в базе данных (что я и хочу):
@Override
public DrawingReleaseDTO findByID(int id) {
DrawingReleaseDTO dto = repository.getDrawingRelease(id);
dto.getReleaseType().setCustom1(true);
return dto;
}
Проблема этого сценария в том, что он не очень эффективен. Я имею в виду, что Hibernate выполняет два запроса - один для DrawingRelease
и один для DrawingReleaseType
.
Я подумал, что способ исправить это - указать JOIN FETCH dwgrel.releaseType relType
, так как это должно заставить hibernate получить все данные за один снимок, но это приводит к ошибке:
в запросе указано присоединение, но владелец извлечен
ассоциации не было в списке выбора
Есть ли способ использовать DTO, включать данные для дочерних объектов и использовать ли все это эффективные запросы?