К сожалению, Критерии позволяют выбирать только корневую сущность, а не любую присоединенную сущность.Таким образом, было бы проще, если бы ваша ManyToMany была двунаправленной.Вы можете использовать критерий, эквивалентный
select b from B b inner join b.as a where a = :theA
Если это не вариант, я думаю, что единственный способ - это использовать подзапрос и, таким образом, кодировать критерии, эквивалентные
select b from B b where b.id in (select b2.id from A a inner join a.list b2 where a.id = :theAId)
Код, таким образом, будет выглядеть так:
Criteria c = session.createCriteria(B.class, "b");
DetachedCriteria dc = DetachedCriteria.forClass(A.class, "a");
dc.createAlias("a.list", "b2");
dc.add(Restrictions.eq("a.id", theA.getId()));
dc.setProjection(Projections.property("b2.id"));
c.add(Subqueries.propertyIn("b.id", dc));