Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate: Фильтрация/Поиск сущностей по, значениям в связанных сущностях 
:(
    Опции темы
powerOn
Дата 23.8.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Всем привет!

Использую 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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Старовъръ
Дата 23.8.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



Не пробовал использовать Exapmle search? Никогда не пробовал, но может поможет...
PM MAIL WWW   Вверх
powerOn
Дата 23.8.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



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


Цитата

Version properties, identifiers and associations are ignored. 


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




--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Старовъръ
Дата 23.8.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



О, а класс Subqueries? Название само за себя говорит.
PM MAIL WWW   Вверх
powerOn
Дата 24.8.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Я покапаю в эту сторону, спасибо. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Andrey1
Дата 26.8.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



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

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


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
VSergeyV
Дата 26.8.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 299
Регистрация: 9.5.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Цитата(Andrey1 @ 26.8.2009,  14:19)
юзаю JPA

А в JPA(Toplink, EclipseLink) можно какнить задать критерии/фильтры на филды сущности OneToMany Collection? Они же подгружаются отдельными запросами, в Hibernate есть @Filter а в JPA как быть?
PM MAIL ICQ   Вверх
Andrey1
Дата 27.8.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



VSergeyV, почему не отдельная тема smile ?


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.