#hibernate #collections #where
#спящий режим #Коллекции #where-предложение
Вопрос:
Я аннотировал объект Hibernate атрибутом @Where на уровне класса. Это ограничивает, какие объекты загружаются, когда я запрашиваю их напрямую, но, похоже, это не применяется к коллекциям этого класса. Этого следовало ожидать?
В документах это неясно: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class
где (необязательно): указывает произвольное условие SQL WHERE, которое будет использоваться при извлечении объектов этого класса.
Мне кажется, что это применимо ко всем случаям, когда извлекаются объекты этого класса, но я заметил, что это игнорируется для коллекций.
- Предназначено ли это для работы с коллекциями?
- Если нет, то каков наилучший способ глобального применения фильтра ко всем экземплярам класса и ко всем коллекциям этого класса?
(ОБНОВЛЕНИЕ: я поднял https://hibernate.atlassian.net/browse/HHH-6781 для отслеживания проблем с документами.)
Комментарии:
1. Похоже, что это должно работать для коллекций, но если это не так, документы должны прояснить это. Я поднял hibernate.onjira.com/browse/HHH-6781
2. Я сталкиваюсь с той же проблемой, но при запросе класса напрямую через Criteria API as
createCriteria(MyEntity.class).scroll()
. Какой метод вы использовали в своем случае, HQL или Criteria API?3. Я использовал критерии: list(), а не scroll() , но я бы не ожидал, что это что-то изменит.
Ответ №1:
@Where на уровне класса будет пропускать нежелательные экземпляры при использовании «GetAll» или «loadAll». Наличие @Where на уровне класса не будет «каскадно» применяться к коллекциям этого объекта.
@Где на уровне свойств коллекции общедоступный класс PuppySeller {
@Where(clause = "status='FOR_SALE'")
public Set<Puppy> getPuppiesForSale() {}
гарантирует, что при выборе «PuppySeller» из базы данных «puppiesForSale» будет заполняться только щенками со статусом «FOR_SALE».
Однако будьте очень осторожны, потому что это применимо только к коллекциям первого уровня. Я имею в виду, что, скажем, у вас есть щенок, и вы хотите выставить всех щенков на продажу у одного и того же продавца. Вы могли бы сделать что-то вроде «myPuppy.getPuppySeller().getPuppiesForSale()». Однако, если вы сделаете это, вы получите всех щенков, независимо от статуса, которые принадлежат puppySeller, включая всех щенков, которые «ПРОДАНЫ» или «НОВОРОЖДЕННЫЕ» И т. Д.
Комментарии:
1. Спасибо. Я думаю, что это в основном ошибка документации. Хотя иногда было бы полезно изменить поведение на то, что я ожидал, я думаю, что это может нарушить BC. Я поднял этот запрос, чтобы отследить исправление документа: hibernate.atlassian.net/browse/HHH-6781