| 
					
						 Right, I've solved this - in case anyone else comes across this post, this is the code snippet - basically you need to use aliases:
 
 Criteria rootCriteria = session.createCriteria(A.class);
 rootCriteria.createAlias("b", "b");
 rootCriteria.createAlias("c", "c");
 rootCriteria.createAlias("c.d", "d");
 
 rootCriteria.add(Restrictions.disjunction()
     .add(Restrictions.eq("d.name", "wibble"))
     .add(Restrictions.conjunction()
         .add(Restrictions.eq("d.town", "blah"))
         .add(Restrictions.eq("b.name", "wobble")));
 
 List result = rootCriteria.list(); 
					
  
						
					 |