DTO projections are very important to doing abstraction over model and data processing. Most common interests are fecthing data with a spesific partition and/or different format other than model. Also DTOs can be very usefull for partial database updates. In JPQL, query results can be transfered into DTOs with new keyword as following:
SELECT new org.module.submodule.ExampleDTO(b) FROM Book b
Also you can send parameters via constructor separately. But this approach provide you to control DTO flow and lazy initializations.
@Getter
@Setter
public class ExampleDTO {
private String bookName;
private Set<BookOwner> bookOwners;
public ExampleDTO (Boob b) {
this.bookName = b.getName();
this.bookOwners = b.getBookOwners();
Hibernate.initialize(b.getBookOwners());
}
}
In the constructor block, you can manage all initialization, property inclusions, property exclusions and customizations.