Запрос критериев гибернации, который использует первичный ключ связанной сущности для фильтрации результатов - PullRequest
3 голосов
/ 09 августа 2011

В нашей системе наша база данных выглядит следующим образом

У одного агентства много брокеров, у одного брокера много пользователей, у одного пользователя много заказов.

Я пытаюсьиспользовать критерии гибернации, чтобы найти все заказы для пользователей по указанному брокерскому договору.В простом SQL это было бы очень легко.Могу ли я сделать это в критериях API?Я считаю, что критерии api работают особенно хорошо, когда есть щелчок и тип фильтра uis, поскольку вы можете создать неупорядоченный список ограничений и добавить их к критериям.

В настоящее время у меня есть это, которое не работает

final Session session = (Session) entityManager.getDelegate();
    final Brokerage brokerage = userAdmin.loadBrokerage(brokerageId);
    @SuppressWarnings({"UnnecessaryLocalVariable", "unchecked"})
    final List<UserOrder> userOrders = session
            .createCriteria(UserOrder.class)
            .add(Restrictions.eq("user.brokerage", brokerage))
            .list();

Я получаю сообщение "Причина: org.hibernate.QueryException: не удалось разрешить свойство: user.brokerage of: com.printlogix.rp.server.domain.UserOrder:".

Можете ли вы передать имена параметров в Restrictions.eq, например, «object.parentobject.property»?

1 Ответ

6 голосов
/ 09 августа 2011

Вы не можете создавать цепочки ассоциаций, как в HQL.Вместо этого вам необходимо определить подкритерии или псевдоним:

Criteria c = session.createCriteria(UserOrder.class);
Criteria userCriteria = c.createCriteria("user");
userCriteria.add(Restrictions.eq("brokerage", brokerage));

или

Criteria c = session.createCriteria(UserOrder.class);
c.createAlias("user", "user");
c.add(Restrictions.eq("user.brokerage", brokerage));

Это задокументировано в Javadoc Criteria и в Справочная документация Hibernate .

...