Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate: Фильтрация/Поиск сущностей по


Автор: powerOn 23.8.2009, 14:49
Всем привет!

Использую Hibernate. Столкнулся со следующей задачей:
Имеется сущность SomeObject и сущность Property связанные один ко многим. SomeObject агрегирует коллекцию Property. Property хранит 2 поля: name и value.

Код

class SomeObject {
    List<Property> properties;
}

class Property {
    SomeObject parent;
    String name;
    String value;
}


Получаются примерно следующие таблицы:
Цитата

SomeObject [id] 
Property   [id | someObjectId | name | value]


где id - это PK, а someObjectId - это FK.

Необходимо выполнить фильтрацию/поиск сущностей SomeObject по значению полей в связанных Property.
Например: наити все сущности SomeObject в коллекции properties которых содержатся 2 property, 
    одно с       name = someName1 и value = someValue1,
    а другое с name = someName2 и value = someValue2.
Это не означает что у SomeObject только 2 Property, просто среди всех имеющихся должны быть те что удовлетворяют поставленным условиям. Два условия - два разных Property, три условия - три Property и т.д.

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

Criteria searchCriteria = getSession().createCriteria(SomeObject.class).createAlias("properties", "prop");
searchCriteria.add(
    Restrictions.and(Restrictions.eq("prop.name", "someName1"), Restrictions.eq("prop.value", "someValue1")));
searchCriteria.list();


Я пытался использовать объединение условий, например:
Код

searchCriteria.add(
    Restrictions.and(Restrictions.eq("prop.name", "someName1"), Restrictions.eq("prop.value", "someValue1")));
searchCriteria.add(
    Restrictions.and(Restrictions.eq("prop.name", "someName2"), Restrictions.eq("prop.value", "someValue2")));


но оно применяется, как не удивительно, к одному и тому же Property из коллекции... естественно prop.name никак не может быть одновременно и someName1 и someName2. 
Задачу можно перефразировать: выбрать все сущности SomeObject у которых есть property с name = someName1 и value = someValue1, а из полученного результата выбрать все сущности SomeObject у которых есть property с name = someName2 и value = someValue2. При этом предполагается что условий фильтрации может быть больше N. 

Сталкивался ли кто-нибудь с подобными задачами? Есть ли идеи по реализации? Если что неясно описал, то готов подробнее растолковать. smile

P.S.: Я конечно знаю альтернативное решение: загрузить все сущности и фильтровать самостоятельно java-кодом, но я не знаю насколько это эффективно. Предполагаю что не очень smile

Автор: Старовъръ 23.8.2009, 16:36
Не пробовал использовать http://docs.jboss.org/hibernate/stable/core/reference/en/html/querycriteria.html#querycriteria-examples? Никогда не пробовал, но может поможет...

Автор: powerOn 23.8.2009, 17:19
Цитата(Старовъръ @  23.8.2009,  17:36 Найти цитируемый пост)
Не пробовал использовать Exapmle search? Никогда не пробовал, но может поможет... 


Цитата

Version properties, identifiers and associations are ignored. 


ассоциации игнорируются... :(


Автор: Старовъръ 23.8.2009, 17:54
О, а класс Subqueries? Название само за себя говорит.

Автор: powerOn 24.8.2009, 20:27
Я покапаю в эту сторону, спасибо. 

Автор: Andrey1 26.8.2009, 14:19
Я обычно юзал подзапрос или прямое произведение таблиц в таких случаях (вставляя параметры, куда нужно).
Но через Criteria конечно - более правильно (понятнее и легче поддерживать). 

P.S. Правда, юзаю JPA Hibernate и там Criteria нету, зато есть либы для DAO классов, а там уже есть.

Автор: VSergeyV 26.8.2009, 20:00
Цитата(Andrey1 @ 26.8.2009,  14:19)
юзаю JPA

А в JPA(Toplink, EclipseLink) можно какнить задать критерии/фильтры на филды сущности OneToMany Collection? Они же подгружаются отдельными запросами, в Hibernate есть @Filter а в JPA как быть?

Автор: Andrey1 27.8.2009, 09:16
VSergeyV, почему не отдельная тема smile ?

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