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??