QueryDsl две таблицы и одна из которых join сама на себя

У меня есть две таблицы Parent и Child

class Parent {
    Integer parenId;

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Child > listOfChild;
    }

    class Child {
    Integer childId;
    String person;
    String mainFlag;
    String channelType;
    String email;
    String webAddress;
    .....

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "FK_PARENT_ID", referencedColumnName = "ID", insertable = true, updatable = true)
    Parent parent;
    }

Я написал SELECT который работает и показывает нужные данные:

SELECT parent.ID, child.PERSON, child.MAIN_FLAG, child_email.ID, child_email.EMAIL, child_webAddress.ID, child_webAddress.WEB_ADDRESS
    FROM PARENT as parent
    join CHILD as child
      on child.ID = parent.ID
    left join CHILD as child_webAddress
      on  child_webAddress.ID = parent.ID
      and child_webAddress.CHANNEL_TYPE = 'WEBADDRESS'
      and child_webAddress.PERSON = child.PERSON
      and child_webAddress.MAIN_FLAG = child.MAIN_FLAG
    left join CHILD as child_email
      on  child_email.ID = parent.ID
      and child_email.CHANNEL_TYPE = 'EMAIL'
      and child_email.PERSON = child.PERSON
      and child_email.MAIN_FLAG = child.MAIN_FLAG
    group by  parent.ID, child.PERSON, child.MAIN_FLAG, child_email.ID, child_email.EMAIL, child_webAddress.ID, child_webAddress.WEB_ADDRESS
    having parent.ID = 10
    order by child.PERSON asc, child.MAIN_FLAG desc

Но не могу переписать его на QueryDSL, я пытаюсь выполнить следующий запрос, но он не работает:

QParent parent = QParent.parent;
    QChild child = QChild.child;
    QChild email = new QChild("email");
    QChild webAddress = new QChild("webAddress");

    JPAQuery<DataComposite> query = new JPAQuery<DataComposite>(entityManager)
        .select(new QDataComposite(
            parent.parentId,
            child.person,
            child.mainFlag,
            email.id,
            email.email,
            webAddress.id,
            webAddress.webAddress))
        .from(parent)
        .join(child)
            .on(child.parent.parentId.eq(parent.parentId))
        .leftJoin(email)
            .on(email.parent.parentId.eq(parent.parentId)
                .and(email.channelType.eq(EMAIL))
                .and(email.person.eq(child.person))
                .and(email.mainFlag.eq(child.mainFlag)))
        .leftJoin(webAddress)
            .on(webAddress.parent.parentId.eq(parent.parentId)
                .and(webAddress.channelType.eq(WEBADDRESS))
                .and(webAddress.person.eq(child.person))
                .and(webAddress.mainFlag.eq(child.mainFlag)))
        .groupBy(
            parent.id.idNumber,
            child.mainFlag,
            child.person,
            email.id,
            email.email,
            webAddress.id,
            webAddress.webAddress)
        .having(parent.parentId.eq(10))
        .orderBy(child.person.asc(), child.mainFlag.desc());

Может кто-нибудь знает как его написать на QueryDSL? Заранее спасибо.


Ответы (0 шт):