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