Я получил все свои данные и преобразовал объект в objectDto. Но почему-то мне кажется, что мой код еще не очень хорош. Здесь мне нужна ваша помощь, мне нужна любая ссылка/совет, чтобы сделать мой код лучше (по производительности). Вот мой рабочий код:
@Override
public List<BookDto> findAll() throws Exception {
try {
List<Book> list = bookDao.findAll();
List<BookDto> listDto = new ArrayList<>();
for (Book book : list) {
BookDto bookDto = new BookDto();
Set<AuthorDto> listAuthorDto = new HashSet<AuthorDto>();
Set<Author> dataAuthor = new HashSet<Author>();
book.getAuthor().iterator().forEachRemaining(dataAuthor::add);
BeanUtils.copyProperties(book, bookDto, "author", "category");
bookDto.setCategory(book.getCategory().getCategory());
for (Author author : dataAuthor) {
AuthorDto authorDto = new AuthorDto();
BeanUtils.copyProperties(author, authorDto);
listAuthorDto.add(authorDto);
}
bookDto.setAuthor(listAuthorDto);
listDto.add(bookDto);
}
return listDto;
} catch (Exception e) {
throw new Exception(e);
}
}
и вот результат, который мне нужен (уже полученный с помощью приведенного выше кода):
[
{
"title": "book1",
"year": "2013",
"author": [
{
"name": "john",
"address": "NY"
},
{
"name": "angel",
"address": "LA"
}
],
"category": "science"
},
{
"title": "book2",
"year": "2014",
"author": [
{
"name": "john",
"address": "NY"
}
],
"category": "science"
},
{
"title": "book3",
"year": "2009",
"author": [
{
"name": "angel",
"address": "LA"
}
],
"category": "comedy"
}
]
Вы можете использовать библиотеку, такую как сопоставитель моделей.




Вместо того, чтобы изобретать велосипед и писать это самостоятельно, вам лучше использовать существующую библиотеку/инструмент, который создан для этого.
Я бы порекомендовал использовать ModelMapper, которая является отличной библиотекой для сопоставления DTO/entity, вам понадобится всего одна строка для преобразования вашей сущности в DTO, что-то вроде:
ModelMapper modelMapper = new ModelMapper();
BookDto bookDTO = modelMapper.map(book, BookDto.class);
Вы можете проверить страница библиотеки Примеры или Учебник Преобразование сущности в DTO для Spring REST API, чтобы углубиться в эту библиотеку.
Я предпочитаю mapstruct из-за возможности увидеть результат генерации кода после отображения и постобработки кода.
Ну, есть несколько способов сделать это, нам просто нужно выбрать подходящий ;)
Во-первых, этот код:
} catch (Exception e) {
throw new Exception(e);
}
смешно, я бы посоветовал никому не показывать этот код.
Второй -
List<Book> list = bookDao.findAll();
List<BookDto> listDto = new ArrayList<>();
здесь вы можете выделить listDto с точным размером, так как вы list.size() == listDto.size(), и в любом другом месте, когда вы знаете точный размер или целевую коллекцию, вам, возможно, придется использовать его. (Для набора хэшей также обратите внимание на коэффициент загрузки).
BeanUtils.copyProperties(
использует здесь ненужное отражение, прямой вызов методов повысит производительность.
Если вы хотите большего - вы можете рассмотреть возможность замены с помощью Hash-наборов для поиска уникальных авторов, возможно, есть более эффективный способ сделать это.
И в качестве общего предложения вы можете использовать http://mapstruct.org/documentation/stable/reference/html/ для сопоставления объектов с dto, чтобы избежать написания шаблонного кода.
Весь этот вопрос выглядит как задание на код-ревью. Не так ли?
почему смешно? Я подумал, что может быть полезно отследить ошибку...?
Вероятно, используя какую-то существующую библиотеку, например, например. «Gson» вообще устранит необходимость в вашем пользовательском коде.