Критерии гибернации для свойства объекта «многие ко многим» - PullRequest
3 голосов
/ 16 декабря 2011
@Entity
class A {

@ManyToMany
private List<B> list;
...
}

@Entity
class B {
...
}

Я хотел бы получить список из класса A, используя критерии (не SQL-запрос).Возможно ли это сделать?Проекция в этом случае не работает.

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

К сожалению, Критерии позволяют выбирать только корневую сущность, а не любую присоединенную сущность.Таким образом, было бы проще, если бы ваша 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));
0 голосов
/ 16 декабря 2011

вы должны быть в состоянии вызвать (при условии, что это экземпляр A)

a.getList();

Если класс А был настроен с помощью соответствующего установщика геттера. Я не вижу необходимости в запросе критериев.

...