Проблема с конструктором DTO в запросе JPQL - PullRequest
0 голосов
/ 30 марта 2019

У меня проблема с передачей аргумента сделать конструктор DTO в запросе JPQL. Я получил ошибку:

Причина: org.hibernate.hql.internal.ast.QuerySyntaxException: Невозможно найти соответствующий конструктор в классе [ekoncept.model.dto.PokojDTO]. Ожидаемые аргументы: int, int, java.lang.String, java.lang.String, int, java.lang.String, int, int, int, java.util.Date, int

Мой JPQL в дао:

@Query("select new ekoncept.model.dto.PokojDTO( \n" +
        "               p.pokojId, p.pokojNr, p.pokojNazwa, p.pokojOpis, \n" +
        "               p.pokojtypId,  pt.pokojtypNazwa, \n" +
        "               p.pokojSprzatany, p.pokojRemontowany, \n" +
        "               m.meldunekId, m.meldunekDataDo, r.rezerwacjaId, \n" +
        "               :today) \n" +
        "from Pokoj p \n" +
        "left join Pokojtyp pt on pt.pokojtypId=p.pokojtypId \n" +
        "left join Meldunek m on m.pokojId = p.pokojId and m.meldunekAktywny = 1 and :today between m.meldunekDataOd and m.meldunekDataDo \n"+
        "left join Rezerwacja r on r.pokojId = p.pokojId and r.rezerwacjaAktywna = 1 and :today = r.rezerwacjaDataOd \n"+
        "where (:status is null) or (p.pokojSprzatany = :status) \n" +
        "order by p.pokojNazwa"
)
List<PokojDTO> getPokojList(
        @Param("status") Integer pokojSprzatany,
        @Param("today") Date today);

Мой конструктор DTO:

public PokojDTO(
        Integer pokojId, Integer pokojNr, String pokojNazwa, String pokojOpis,
        Integer pokojtypId, String pokojtypNazwa,
        Integer pokojSprzatany, Integer pokojRemontowany,
        Integer meldunekId, Date meldunekDataDo, Integer rezerwacjaId,
        Date today) {

    this.pokojId = pokojId;
    this.pokojNr = pokojNr;
    this.pokojNazwa = pokojNazwa;
    this.pokojtypId = pokojtypId;
    this.pokojtypNazwa = pokojtypNazwa;
    this.pokojOpis = pokojOpis;
    this.pokojSprzatany = pokojSprzatany;
    this.pokojRemontowany = pokojRemontowany;
    this.meldunekId = meldunekId;
    this.meldunekDataDo = meldunekDataDo;
    this.rezerwacjaId = rezerwacjaId;

    switch (pokojSprzatany) {       // status sprzątania
        case 0:
            statusSprzatania = "Sprawdzony";
            break;
        case 1:
            statusSprzatania = "Brudny";
            break;
        case 2:
            statusSprzatania = "Czysty";
            break;
        default:
            statusSprzatania = "???";
    }

    if (rezerwacjaId != null && meldunekId != null) {      // status pobytu
        statusPobytu = "Zmiana";
    } else if (meldunekId != null) {
        if (meldunekDataDo.equals(today)) {
            statusPobytu = "Wyjazd";
        } else {
            statusPobytu = "Pobyt";
        }
    } else if (rezerwacjaId != null) {
        statusPobytu = "Przyjazd";
    } else {
        statusPobytu = "Wolny";
    }
}

Дао звонок:

public List<PokojDTO> getPokojList(Integer pokojSprzatany) {
    Date today = sysoperMgr.getToday();
    return pokojDao.getPokojList(pokojSprzatany, today);
}

Я знаю, что проблема в том, что в конструкторе есть «сегодня», потому что он не перенаправляет в конструктор (почему?). Передача параметров в конструктор DTO не поддерживается в JPQL? Есть ли какое-нибудь решение этого или, возможно, другой синтаксис требуется?

...