Search code examples
spring-dataquerydsl

How to write a QueryDSL method when join table does not have its own Entity defined


Tables:
------

MEMBER
----------
MEMBER_ID(PK)
MEMBER_NAME

MEMBER_MANAGER
------------
MEMBER_ID(FK - MEMBER.MEMBER_ID)
MANAGER_ID(FK - MEMBER.MEMBER_ID)

I only had to create Member class. I did not create MemberManager class as I have defined one-to-manay relation in Member class as: ...

@OneToMany
@JoinTable(name = "member_manager", joinColumns = @JoinColumn(name = "member_id") , inverseJoinColumns = @JoinColumn(name = "manager_id") )
private Set<Member> memberManagers;

QueryDSL method:

public Member getDetails(Long memberId)
{
    QMember member = QMember.member;
    QMember memberManager = QMember.member;
    JPQLQuery query = new JPAQuery(entityManager);

    Member memberDetail = query.from(member)
                           .innerJoin(member.memberManagers, memberManager)
                           .where(memberManager.id.eq(memberId)).uniqueResult(member);
    return memberDetail ;
}

However the above does not yield me a valid result.

Below is the plain SQL join that gives me a valid result. I would like this one to translated to QueryDSL. How do I achieve this? Thanks.

select m.id, m.name from member m inner join member_manager mm on m.id = mm.manager_id where m.member_id=?

Solution

  • QMember member = QMember.member;
    QMember memberManager = QMember.member;
    

    You're reusing the same runtime object.

    QMember member = QMember.member;
    QMember memberManager = new QMember("member_manager");
    

    You have to make a new variable to refer to the joined relation.