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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate criteria и джоин 
:(
    Опции темы
iLoveJava
Дата 18.1.2010, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Опишу проблему.

Есть у нас ентити юзер и ентити которые соответсвуют разным отношениям между пользователями (друзья, враги, собутыльники и т.д.).
Собственно что мы хотим уметь делать.

1) Текущий пользователь ищет других
    a) мы хотим чтобы в результаты не попали те которые в каком-то отношении с этим текущим пользователем
    б) что бы в результаты попали только те которые в каком-то отношении с этим текущим пользователем
2) Текущий пользователь ищет других и хочет видеть информацию о пользователе и о состоянии его отношений с этим пользователем, если отношений нету он просто видит пользователя.

Какие отношения участвуют будет задаваться как параметры для поиска. Количество отношений может увеличиваться могут появляться новые и т.д. т.п. В класса пользователя нету мапинга на отношения в отношений есть.

Приблизительно как эти ентити выглядят (они конешно сложнее но для данной задачи ничего другого нам не надо)
Код

class User {
    private Long id;

    // get and set

    ...

}

class Relation {
    private Long id;
    
    // Мапинг
    private User owner;
    private User matcher;

    // get and set

    ...

}

class Block extends Relation {

    ...

}

class Favorite extends Relation {

    ...

}


В чем проблема:
Я не могу искать с помощью критерии User-ов у них нету мапингов в тоже время куча остальных критериев поиска (цвет глаз/место жительства и т.д.) относятся только к User.
И спользовать HQL чет не очень хочется но судя по всему по другому никак... smile 

Ну допустим мы решим юзать HQL... но ведь это превратится в какойто кошмар с генерацией этих строк... придется писать какоето подобие критерии что бы все было хоть более-менее сносным.

Ситуацию как всегда усложняет куча существующего кода  smile 
Уже есть целая иерархия класов поиска которые завязаны на критерии. Если раньше методы которые добавляли новые критерии поиска получали криетрию от предка и добавляли туда свои условия... то щас так просто все не выйдет. Надо будет может какой обект квери куда будут добавляться условия и ток уже при самом его вызове с низ будет формироваться HQL. Но у меня чувство что я буду изобретать велосипед! повторюсь ведь я сделаю в результате какоето подобие критерии  smile  и меня это очень смущает. Создается в печатление что дольжно быть простое и елегантное решение.

Конешщно еще как вариант мы можем все это свести к вызову запроса потом обработке реузльтата через существующие сервисы...
Но это тоже не впечатляет есть предчувствие что это мягко говоря будет не очень производительно.

От пример:
Мы дольжны выдать на страничку 20 юзеров (конечно может быть и меньше если они не соответствуют требованиям но интересней варинант когда их больше).
1) мы находим всех пользователей которых заблокировал текущий и добавляем условие что бы юзер не был в этом списке
2) потом ищем 20 юзеров
3) проходим по 20 пользователях и получаем все отношения которые хотел бы видеть текущий

Вариант по хуже
1) делаем запрос на 20 юзеров которые соответствуют критериям
2) с этих 20 для каждого выясняем не заблочен ли он и если  заблочен удаляем с результата
3) добавляем найденых пользователей в список
4) если у нас нету 20 пользователей идем в 1 иначе возвращаем первые 20 (так можна и 1000 запросов выполнить)
5) проходимся по ним и получаем для них отношения.

1 вариант кажется лучше 2 но не похож на очень то елегантное решение, а если пользователь заблокирует 500 человек у нас будет список для "not (user.id in (userIdList))" с 500 польхователями и тд.

Хотелось бы получить что то такого рода:
1) делаем запрос на 20 пользователей в котором джоиним пользователя с таблицей заблоченых так что бы в результат не попали пользователи которых текущий заблочил ( ну или это просто можна добавить условием в запрос) 
2) проходимся по ним и получаем для них отношения. (это мне тоже не нравится но чето я сомневаюсь что можна както по другому. Может как вариант искать отношения текущего с пользхователями которые попадают в список айдишек тогда будет 1 запрос на отношение вместо 1 запроса на пользователя)

Поидее это будет похоже на проблему вывода чего-то в зависимости от настроек пользователя, но только в случае коргда, количество настроек не фиксировано и может увеличиваться соответственно код не дольжен зависеть от того что за настройки будут использоваться.

Хотелось бы узнать как вы боретесь с подобными проблемами ( в часности если нету мапинга все одна дорога HQL?).

п.с. где писать по хибернейту не понятно решил в этот раздел
п.п.с. надеюсь излодил все понятно
PM MAIL   Вверх
iLoveJava
Дата 20.1.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



чувствую народ боится стены текста  smile 
PM MAIL   Вверх
dementiev
Дата 4.2.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



сгенерь маппинг в нетбинсе(самому писать его не надо).
PM MAIL   Вверх
afon
Дата 6.2.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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