Критерии Hibernate объединяют две таблицы с условием на 2-й таблице и приводят к 1-й таблице - PullRequest
4 голосов
/ 07 апреля 2011

У меня вопрос с использованием критериев гибернации, мне нужно преобразовать этот запрос с использованием критериев.

ВЫБРАТЬ * ИЗ СОЕДИНЕНИЯ A a_ INNER B b_ ON a_.column1 = b_.column1 И b_.column2 IN (X, Y) И active = 'Y';

Мне нужен результат в виде таблицы A.

Ответы [ 2 ]

1 голос
/ 28 апреля 2016

Я только что решил эту проблему, вот мой код

        Criteria criteria = session.createCriteria(ProductOffer.class);
        criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

        Date effDate = TypeConvertUtil.toDate(param.get("effDate"));

        criteria.add(Restrictions.le("effDate", effDate));
        criteria.add(Restrictions.gt("expDate", effDate));


        criteria.createAlias("productOfferPropDefs", "def",JoinType.LEFT_OUTER_JOIN);
        criteria.setFetchMode("productOfferPropDefs", FetchMode.JOIN);
        criteria.add(Restrictions.le("def.effDate", effDate));
        criteria.add(Restrictions.gt("def.expDate", effDate));


        criteria.createAlias("def.productOfferProps", "prop",JoinType.LEFT_OUTER_JOIN);
        criteria.setFetchMode("def.productOfferProps", FetchMode.JOIN);
        criteria.add(Restrictions.le("prop.effDate", effDate));
        criteria.add(Restrictions.gt("prop.expDate", effDate));

        productOfferList = criteria.list();

Обратите внимание, что

criteria.createAlias("productOfferPropDefs", "def",JoinType.LEFT_OUTER_JOIN);

этот параметр важен:

JoinType.LEFT_OUTER_JOIN

если выне использовал его, и ваше отношение «один ко многим», оно затронет классическую проблему 1: N для спящего режима

1 голос
/ 07 апреля 2011

Если ассоциации определены, см. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-associations

Если ассоциации не указаны в определении сущностей, вы не можете использовать критерии.Вы можете использовать HQL для внутренних соединений (необходимо записать в запись неявного соединения ), для выполнения левых объединений вы должны использовать собственный SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...