Критерии JPA2 - выберите элемент, который имеет коллекцию с другим элементом с указанным значением

Есть два класса A и B. Класс A содержит набор объектов класса B. Класс B имеет поле X. Я хотел бы иметь возможность возвращать список объектов класса A, которые имеют в своих коллекциях объекты типа B, имеющие определенное значение их свойства X. Возможно ли это вообще?

До сих пор я пробовал что-то вроде:

Root<A> root = criteriaQuery.from(A.class);
criteriaQuery.select(root);
criteriaQuery.where(root.get("bCollection").get("x").in("value"))

но конечно не работает. Как справиться с этим? Класс B отображается как вложенный компонент следующим образом:

<set name="bCollection" table="bCollection">
            <key column="a_id" />
            <composite-element
                class="example.B">
                <many-to-one name="x" column="b_id" not-null="false"
                    cascade="none" foreign-key="b_fk" />
            </composite-element>
</set>

Я надеюсь, что кто-то знает... спасибо!


person user2902211    schedule 08.01.2014    source источник


Ответы (1)


Конечно, это возможно:

  1. Создайте корень A (как вы это сделали).
  2. Соедините корень A с B, получив Join B.
  3. Добавьте условие where, используя полученный Join B.

Примеры предложения IN можно найти в Google или проверить этот ответ. .

person Andrei I    schedule 08.01.2014
comment
В ПОРЯДКЕ :)! Но как сделать то же самое, если тот набор объектов типа B находится не непосредственно в A, а в каком-то классе C внутри класса A? Этот класс C отображается как компонент, поэтому он ничего не добавляет к иерархии... - person user2902211; 09.01.2014