QueryDsl предоставляет инструмент для агрегирования результатов, возвращаемых из базы данных, следующим образом:
http://www.querydsl.com/static/querydsl/latest/reference/html/ch03s02.html
В позиции: 3.2.4. Агрегация результатов
Но я не знаю, как выполнить трехуровневую агрегацию, и я не нашел никакой документации по ней, ни в классе автоматических тестов QueryDSL этот случай не появляется, и он выглядит очень странно, что это невозможно, так как это очень распространенный случай.
Вот пример того, что я хочу сделать:
Классы DTO:
class DtoLevel1 {
Long id;
List<DtoLevel2> level2;
}
class DtoLevel2 {
Long id;
List<DtoLevel3> level3;
}
class DtoLevel3 {
Long id;
}
Запрос :
QDtoLevel1 dtoLevel1 = QDtoLevel1.dtoLevel1;
QDtoLevel1 dtoLevel2 = QDtoLevel1.dtoLevel1;
QDtoLevel1 dtoLevel3 = QDtoLevel1.dtoLevel1;
JPAQuery<DtoLevel1> query = new JPAQuery<DtoLevel1>();
// ... query.from, etc
query.transform(
GroupBy.groupBy(dtoLevel1.id).as( // the first level is ok
Projections.constructor(
DtoLevel1.class, dtoLevel1.id,
GroupBy.list( // passing grouped items in the first level
Projections.constructor(
DtoLevel2.class,
dtoLevel2.id,
GroupBy.groupBy(dtoLevel2.id) // the problem is here
.list(
Projections.constructor(DtoLevel3.class, dtoLevel3.id)
)
)
)
)
)
)
В строке, где я выделил свою проблему, приведен концептуальный код, который, как я считаю, должен работать. Именно здесь мне нужно сгруппировать элементы третьего уровня, принадлежащие текущему второму уровню, но я не нашел способа сделать это, только для первого уровня.