Zagnieżdżone SELECT new DTO() w JPQL

0

Witam,

posiadam takie DTO:

@Builder
@AllArgsConstructor
public class CustomerDTO {

    private String firstName;

    private String lastName;

    private AccountDTO accountDTO;

    private AddressDTO addressDTO;
}

no i chcę zrobić dość zagnieżdżonego selecta, który w skrócie ma wyglądać tak:

@Override
public List<CustomerDTO> findByStreet(String street) {
        TypedQuery<CustomerDTO> query= em.createQuery("SELECT new CustomerDTO(c.firstName, c.lastName, new AccountDTO(ac.login), new AddressDTO(a.city, a.street, a.houseNumber, a.zipCode)) " +
                "from Customer c, Address a, Account ac " +
                "join c.address a " +
                "join c.account ac " +
                "where a.street=:street", CustomerDTO.class)
                .setParameter("street", street);

        return query.getResultList();
    }

ale nie można mieć zagnieżdżonych new w sobie, więc jak to obejść? Inaczej napisać DTO? Czy jakieś obejście na takie Query są?

0

Na twoim miejscu aby pominąć zagnieżdżone new zrobiłbym "płaski" konstruktor a dopiero w nim pole mapował Stringi na obiekt AdressDTO.

0

Czyli w select odbieram tylko DTO Customer'a, w nim pobierałbym sztywno dane typu Address.street, a tam mapował ten String w DTO?

0

Chodziło mi o coś takiego jak poniżej.
Taki select:
"SELECT new CustomerDTO(c.firstName, c.lastName, ac.login, a.city, a.street, a.houseNumber, a.zipCode) "

I taki konstruktor nie-lombokowy:

CustomerDTO(String firstName, String lastName, String aclogin, String city, String street, String houseNumber, String zipCode) {
this.firstName = firstName;
this.lastName = lastName
this.aclogin accountDTO = new new AccountDTO(aclogin);
this.addressDTO = new AddressDTO(city, street, houseNumber, zipCode);
}

0

Hm, czyli to byłoby najlepsze rozwiązanie, tak?

Ogólnie to np. potem gdy potrzeba mi jeszcze bardziej okrojone DTO to:
a) tworzyć nowe DTO dla każdej potrzeby
b) bawić się konstruktorami?

0

Czy to najlepsze rozwiązanie? Nie jestem wstanie odpowiedzieć aczkolwiek działa i jest obejściem na twój problem. ;)

Co do twojego pytania: sam bym tworzył nowe DTO, może niekoniecznie zapytanie z konstruowaniem nowego DTO a coś w stylu: stare zapytanie -> rezultat w postaci DTO1 -> mapowanie na okrojone DTO2. Z doświadczenia wiem że jeden "boski DTOs" to złe rozwiązanie i kierowałbym się w stronę "drobnicy" niż jednego uniwersalnego, okrojonego (np. nullowatymi polami, bo czemu nie - widziałem coś takiego) w zależności od użycia DTOsa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1