QueryDSl многоуровневая агрегация результатов - PullRequest
0 голосов
/ 09 января 2020

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)
                                )
                        )
                    )
            )
    )
)

В строке, где я выделил свою проблему, приведен концептуальный код, который, как я считаю, должен работать. Именно здесь мне нужно сгруппировать элементы третьего уровня, принадлежащие текущему второму уровню, но я не нашел способа сделать это, только для первого уровня.

...