У меня есть вызов критериев Hibernate, который я хочу выполнить в одном операторе SQL. Что я Я пытаюсь выбрать экземпляры Parent, у которых есть дочерние элементы со свойством в диапазоне значений (предложение SQL IN), и все это при загрузке дочерних элементов с использованием внешнего соединения. Вот что у меня есть на данный момент:
Criteria c = session.createCriteria(Parent.class);
c.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN)
.setFetchMode("c", FetchMode.JOIN)
.add(Restrictions.in("c.property", properties));
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return c.list();
Вот несколько примеров data:
Parent
Parent ID
A
B
C
Children
Child ID Parent ID property
... A 0
... A 2
... A 7
... B 1
... C 1
... C 2
... C 3
Я хочу вернуть родителей и ВСЕХ их потомков, если один из потомков имеет свойство, равное моему параметру (ам) привязки. Предположим, что свойства - это массив, содержащий {2}. В этом случае вызов вернет родителей A и C, но их дочерние коллекции будут содержать только элемент 2. Т.е. Parent [Children]:
A [2] & C [2]
Я хочу:
A [0 , 2, 7] & C [1, 2 3]
Если это не ошибка, значит, семантика нарушена. Я не понимаю, как вызвать A.getChildren () или C.getChildren () и возврат 1 записи будет считаться правильным - это не прогноз. Т.е. если я дополню запрос, чтобы использовать выборку по умолчанию, он вернет правильные дочерние коллекции, albiet с множеством запросов:
c.createAlias("children", "c").add(
Restrictions.in("c.property", properties));
Это ошибка? Если нет, как я могу достичь желаемого результата?