Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > hibernate load object by filtre


Автор: askell 21.4.2010, 21:23
Пипл хелп))) Очень нужно)))
Проблема следующая. Работаю с базой через hibernate. Использую критерю для обращения к объекту. У меня есть бин Manufacturer у него есть связь one-to-many к бину Product. Соответственно когда я вытаскиваю бин  Manufacturer он подгружает коллекцию объектов Product. Например производитель "HTC" и все его продукты. Мне нужно фильтровать это коолекцию чтобы продукты выбирались по полю стоимость. 

Criteria criteria = session.createCriteria(Manufacturer.class);
criteria.add(Restrictions.eq("code", getManufacturer().getCode()));

// незнаю что вставить чтобы getProductListCollection() возвращялась не вся а по заданному параметру

Manufacturer manufacturer = (Manufacturer)criteria.uniqueResult();
manufacturer.getProductListCollection() - нужно чтобы коллекция проинициализированая hibernate возвращала не все записи связанные с производителем а по критерию

На sql это делается в два запроса.

1) select * from  Manufacturer m where m.id = 5- получаем производителя
2) select * from Product p where p.manufacturerId = 5 and p.cost = 100 

Автор: 5ad1sT 22.4.2010, 10:32
Попробуй вот такой рестрикшн Restrictions.sqlRestriction(sql).

Автор: askell 22.4.2010, 12:47
Цитата(5ad1sT @  22.4.2010,  10:32 Найти цитируемый пост)
sqlRestriction


А по подробнее можешь написать? 


Автор: 5ad1sT 22.4.2010, 14:07
Вот пример. http://www.java2s.com/Tutorial/Java/0350__Hibernate/AddRestrictionssqlRestrictiontoCriteria.htm


Автор: askell 22.4.2010, 20:08
Цитата(5ad1sT @  22.4.2010,  14:07 Найти цитируемый пост)
Вот пример. http://www.java2s.com/Tutorial/Java/0350__...ntoCriteria.htm



Спасибо, только это совсем не то:
Criteria crit = session.createCriteria(Survey.class);
    crit.add(Restrictions.sqlRestriction("name like 'S%'"));

здесь он непосредственно добавляет критерию в обект Survey, а в моем случае producs является коллекцией из другой таблицы в объекте Manufacturer. Hibernate генерит отдельный запрос для получения этих данных.

Автор: MisterCleric 23.4.2010, 09:21
Привет.
В книжке http://www.google.com/search?q=java+persistence+with+hibernate
Есть такая глава: 12.3.1 Dynamic data filters
Так вот там и написано о желаемых фильтрах:
Цитата

 If the association between Category and Item was one-to-many, you’d created
the following mapping: 
<class name="Category" table="CATEGORY">
    ...
    <set name="items">
        <key column="CATEGORY_ID"/>
        <one-to-many class="Item"/>
        <filter name="limitItemsByUserRank"
                condition=":currentUserRank >=
                           (select u.RANK from USERS u 
➥ where u.USER_ID = SELLER_ID)"/>
    </set>
</class>
With annotations, you just place the  @org.hibernate.annotations.Filter(s)
on the right field or getter method, next to the  @OneToMany or  @ManyToMany
annotation. 


Сам никогда их не пробовал, но вот есть такое. Попробуй - расскажешь

Автор: askell 24.4.2010, 10:58
Спасибо) Этот вариант отлично подойдет))

Автор: askell 1.5.2010, 02:24
Фильтры вообще штука классная. я не знал что их можно использовать внутри маппинга для связей. Сорри, этот вариант я юзал только в тесте, все отлично))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)