QueryDsl две таблицы и одна из них присоединяется к себе - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть две таблицы 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 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? Заранее большое спасибо.

...