Критерии гибернации - как ограничить результаты объединения одним типом сущности? - PullRequest
3 голосов
/ 07 декабря 2010

ОК, следующий запрос:

SELECT O.*, P.* FROM ORDERS O, PRODUCT P WHERE
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’;

можно сделать с помощью следующих критериев:

List ordersAndProducts = session.createCriteria(Order.class)
    .setFetchMode(“products”,FetchMode.JOIN)
    .add(Restrictions.eq(“id”,”1234”))
    .list();

, но здесь Criteria.list() возвращает List<Object[]>, где Object[0] - это Order, а Object[1] - это Product для каждого элемента в списке.

Но как я могу сделать следующий SQL с критериями:

SELECT O.* FROM ORDERS O, PRODUCT P WHERE 
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’;

Другими словами, я хочу, чтобы Criteria.list() дал мне List<Order>, меня не волнует Products. Я попытался использовать createAlias() вместо setFetchMode(), но результаты остались прежними, и проекции не позволяют вам указывать сущность, только свойство.

Ответы [ 2 ]

6 голосов
/ 07 декабря 2010

Вы можете использовать .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) по критериям.

List ordersAndProducts = session.createCriteria(Order.class)
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    .setFetchMode(“products”,FetchMode.JOIN)
    .add(Restrictions.eq(“id”,”1234”))
    .list();

Теперь вы получаете все заказы с загруженными продуктами.

2 голосов
/ 07 декабря 2010

Используйте метод createCriteria в классе Criteria для отношения.

List ordersAndProducts = session.createCriteria(Order.class)
    .createCriteria(“products”)
        .add(Restrictions.eq(“id”,”1234”))
    .list();

Вы можете прочитать (немного запутанную) документацию об этом здесь .

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