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();
|