I’ve had to do this for a couple of reasons, mainly job types and such in the talent user entity and then again in any one to many users like groups and types.
<quer:projection id="listAggJobType" alias="JobType">
<quer:query projectedClass="Application" alias="talentUserJobType">
<quer:projections>
<quer:projection alias="talentUserJobType_list" projectedValueType="string">
<quer:customFunction name="listagg">
<quer:field path="Candidate,TalentUser,JobTypes,Description"/>
<quer:string> ~ </quer:string>
</quer:customFunction>
</quer:projection>
</quer:projections>
<quer:filterings>
<quer:filtering>
<quer:equal>
<quer:field path="Number"/>
<quer:field ownerQuery="MainQuery" path="Number"/>
</quer:equal>
</quer:filtering>
</quer:filterings>
</quer:query>
</quer:projection>