Критерии API работает с реляционным отображением.Если нет никакой связи между городом, штатом или страной, вы не можете использовать что-то вроде вышеупомянутого решения.У меня есть два предложения. Во-первых, вы можете использовать два критерия.
DetachedCriteria ownerCriteria = DetachedCriteria.forClass(State.class);
ownerCriteria.setProjection(Property.forName("id"));
ownerCriteria.add(Restrictions.eq("countryId", countryParam));
Criteria criteria = getSession().createCriteria(City.class);
criteria.add(Property.forName("stateId").in(ownerCriteria));
Во-вторых, используйте hql с перекрестным соединением.Взгляните на здесь .
Наконец, я думаю, что лучше написать этот запрос с нативным SQL.;)