2010-12-07 2 views
3

Итак, следующий запрос:Hibernate Criteria - как ограничить результаты объединений одним типом объекта?

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(), но результаты те же, и Projections не позволяют указать объект, только свойство.

ответ

6

Вы можете использовать .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(); 

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

+0

Спасибо! Я подозревал, что использование ResultTransformer было бы таким, но довольно непрозрачная документация не помогла определить, какой из них использовать. – mluisbrown 2010-12-07 15:33:37

+0

хороший ответ (geht doch ... :-)) – 2010-12-08 14:08:47

2

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

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

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

Смежные вопросы