Критерии гибернации с ограничениями для детей

У меня есть вызов критериев 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));

Это ошибка? Если нет, как я могу достичь желаемого результата?

8
задан Mikko Maunu 17 December 2017 в 12:40
поделиться