У меня проблема с передачей аргумента сделать конструктор 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? Есть ли какое-нибудь решение этого или, возможно, другой синтаксис требуется?