Hibernate Criteria API фильтрует коллекцию - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть

Class A{
  List <B> bList

}

Class B {
 String name;

}

Теперь я хочу написать запрос, используя API критериев Hibrnate, чтобы я мог получать только A pojo с фильтрованным свойством bList, имеющим только B pojo

 where "b.name"  == 'abc'

Ответы [ 2 ]

5 голосов
/ 07 февраля 2012

Это очень опасная вещь, и хотя она поддерживается Hibernate, она не поддерживается JPA, поскольку загружаемые им объекты не отражают реальность того, что хранится в базе данных.Если вам случится изменить список B, Hibernate может удалить все B, которые соответствуют A, но не были загружены запросом.

При этом это простое внутреннее соединение с выборкой.режим:

Criteria c = session.createCriteria(A.class, "a");
c.createAlias("a.b", "b");
c.add(Restrictions.eq("b.name", "abc");
c.setFetchMode("a.b", FetchMode.JOIN);
0 голосов
/ 25 ноября 2015

Я попробовал приведенный выше код, и мне кажется, что он не фильтрует коллекцию B.

В конце концов я добавил дополнительный фильтр в классе A

@FilterDef(name="BFilter",  
parameters= @ParamDef( name="bName", type="string" ) )
Public class A{

    @Filter(
        name = "BFilter",
        condition="name = :bName"
    )
    private List<B> bList;
}

а затем я использую setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);, чтобы получить отдельный класс A

Он запрашивает 2 раза в БД и может быть нежелательным.Поправьте меня, если есть другие варианты.

...