Использование DTO в качестве полей в другом DTO - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть две сущности и две соответствующие таблицы в БД

public class Book {
    private int id;
    private int authorId;
    private String title;
    private int year;

    // getter setter;
}

public class Author {
   private int id;
   private String firstName;
   private String lastName; 

   // getter setter;
}

Мне нужно отправить в RestController список следующих DTO (Список книг)

public class BookDto {
   private int id;
   private AuthorDTO author;
   private String title;
   private int year;

   // getter setter; 
} 

Соответственно, мне нужен следующий DTO

public class AuthorDTO {
   private int id;
   private String firstName;
   private String lastName; 

   // getter setter;
}

Где и как я могу объединить эти два DTO? Для получения данных из БД я использую JdbcTemplate. И у меня есть методы getAuthorById (вернуть автора), getAuthorsByIds (вернуть список), getBookById (вернуть книгу), getBooksByIds (вернуть список).

Теперь я создаю промежуточный класс

public class BookWithAuthor {
   private int id;
   private Author author;
   private String title;
   private int year;

   // getter setter; 
}

и далее logi c в обслуживании

List<BookWithAuthor> getBooksWithAuthors(Set<Integer> ids) {
    List<Book> books = getBooksByIds(ids);

    List<Author> authors = getAuthors(books);

    return books.stream()
            .map(book -> getBooksWithAuthors(book, authors)
            .collect(Collectors.toList());
}

private List<Author> getAuthors(List<Books> books) {
    Set<Integer> getAuthorsIds = books.stream()
            .map(Books::getAuthorId)
            .collect(toSet());

    return authorService.getAuthorsByIds(getAuthorsIds );
}

private BookWithAuthor getBooksWithAuthors(Book book, List<Author> authors) {
    BookWithAuthor bookWithAuthor= new BookWithAuthor();

    bookWithAuthor.setId(book.getId());
    bookWithAuthor.setAuthor(getAuthor(authors, book.getAuthorId()));
    // and next setting

    return bookWithAuthor;
}

Я не уверен, что это правильный путь или, может быть, здесь более простые способы.

...