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? Заранее спасибо.