Прежде чем думать о Критериях, вам нужно сначала нарисовать сырой SQL.
Вы можете сделать это в SQL следующим образом (при условии, что есть таблица AB
, объединяющая записи между A
и B
, где fk_A
указывает на id
в A
и fk_B
указывает на id
in B
):
SELECT fk_A, count(fk_B) FROM AB
WHERE fk_B IN (b3, b5)
GROUP BY fk_A
HAVING count(fk_B) = 2
Таким образом, вы не получите «неполные» записи из A
, поскольку оператор HAVING count(fk_B)
фильтрует их. Само собой разумеется, вам придется заменить 2
на соответствующий номер, если сумма B отличается.
Далее идет трудная задача по преобразованию этого в Критерии :) Некоторый псевдо (читай: непроверенный) код:
Criteria criteria = getSession().createCriteria(A.class);
criteria.add(Restrictions.in("fk_B", new String[] {b3, b5}));
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.count("fk_B"));
projectionList.add(Projections.groupProperty("fk_A"));
criteria.setProjection(projectionList);
Как видите, этот критерий по-прежнему пропускает HAVING
бит. К сожалению, HAVING
еще не поддерживается в Criteria API. Однако вы должны получить список результатов и count и игнорировать те из них, где count меньше требуемого.