![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
eugeneu |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 25.3.2011 Репутация: нет Всего: нет |
Здравствуйте. Недавно стал использовать Hibernate3 в связке со Spring 3 в своем проекте.
Я использую аннотации для указания связей между сущностями и каждый раз делаю lazy initialization дабы не тянуть лишний раз данные. А если же они нужны то я делаю специальный HQL-запрос. Рассмотрим следующий пример: Имеется сущность "Сотрудник"
Имеется сущность - "Разрешение"
Далее есть метод в котором я собственно получаю данные через HQL запрос:
Много раз слышал, что получение List<> сущностей не есть хороший тон программирования - а хорошим тоном является получения Set<>. Посути мне List не нужен - достаточно получить Set<Employee>. Но не понятно как через HQL-запрос получить Set<Employee>, не брибегая к преобразованию List в Set. Подскажите пожалуйста. заранее спасибо. Это сообщение отредактировал(а) eugeneu - 4.4.2011, 18:35 |
||||||
|
|||||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
eugeneu, никак нельзя. В результатах запроса могут быть дубликаты, которые могут быть нужны приложению, поэтому org.hibernate.Query поддерживает только возврат списка. Возможно было бы полезным иметь какой-то convenient метод, который возвращал бы Set, но ведь преобразовать легко и самому:
|
|||
|
||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 5 Всего: 191 |
||||
|
||||
Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 1 Всего: 10 |
Наоборот, работа с Set подразумевает много сложностей, связанных с реализацией equals() & hashCode(), так что я бы советовал везде использовать List вместо Set.
-------------------- |
|||
|
||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 4 Всего: 16 |
Set – подразумевает уникальность каждого елемента.
|
|||
|
||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 5 Всего: 191 |
||||
|
||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 4 Всего: 16 |
Конечно. Set, например, подразумевает неупорядоченность элементов. В то время как List – упорядоченность. Тип должен улучшать читаемость программы, имно.
Это сообщение отредактировал(а) dobrolub - 4.4.2011, 22:41 |
|||
|
||||
eugeneu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 25.3.2011 Репутация: нет Всего: нет |
Постараюсь аргументировать...
В данном примере у "Сотрудника" может быть набор ролей - каждая из которых уникальна, если отслеживать уникальность "Ролей" при добавлении их "Сотруднику" то дубликатов быть не должно... Если использовать List то мы тратим память на порядок записи в списке, а в данном случае это не требуется, достаточно просто получить массив. Вы правы в некоторых случаях действительно нужен List когда нужен порядок записей - в этом случае и буду использовать HQL. Но если уйти от CreateQuery с HQL то как можно принудительно инициализовать набор "Разрешений" для "Сотрудника" получив при этом Set? |
|||
|
||||
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: нет Всего: 3 |
Немного отойду от темы.
eugeneu, в вашем примере, лучше возвращать unique, а не список, при получении Employee, так как логин уникальный. Я в основном маппинг делаю через файл, замапьте authorities через set и хибер вернет вам set. Или если через аннотации, то укажите тип Set<>, должен вернуть set. Еще чтобы получить set, можно у query через iterable и scroll самому вставлять объекты в свою коллекцию. И еще у хибера есть класс Hibernate или HibernateUtils, в нем должен быть метод initialize, который инициализирует lazy свойства, если я не спутал. Это сообщение отредактировал(а) emmanuil - 5.4.2011, 08:27 |
|||
|
||||
eugeneu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 25.3.2011 Репутация: нет Всего: нет |
Спасибо, попробую!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |