i've just had to do the same thing but it appears anthony's answers is loading the main class A each time??
well, sorry if i got that wrong (totally possible), but I decided to load my main class with 1 fetch and then to load the other collection directly.
Code:
Query q = session.createQuery(
"from X as x " +
" left outer join fetch x.coll1 " +
"where x.id = :xId"
);
q.setParameter("xId", idParam);
X x = (X) q.list().get(0);
q = session.createQuery(
"from CollType as c " +
"where c.x.id = :xId"
);
q.setParameter("xId", idParam);
x.setCollType(q.list());
this works but i don't know if it's the best way. It just seemed to me that select from a with a fetch for B, C and D was heavy in comparison??