powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate выборка из lazy коллекции
13 сообщений из 13, страница 1 из 1
Hibernate выборка из lazy коллекции
    #37655462
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Наткнулся недавно на очень интересный момент в хибере. Баг это или фича я не знаю.

есть маппинг объекта
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<hibernate-mapping package="xxx.yyy.zzz.objects">
    <class name="ObjName" table="OBJTABLE">
...
<list name="obj1" table="OBJ1_LINKS" lazy="true" cascade="all-delete-orphan">
            <key column="OBJ1_ID"/>
            <list-index column="SORTIDX"/>
            <many-to-many column="ObjName_ID" class="AnyOtherClass" unique="true"/>
</list>
...
</class>
</hibernate-mapping>


нужно выбрать такие ObjName из БД у которых в коллекции присутствует obj1,
одно из полей которого удовлетворяет какому-либо условия.

Собственно сам код для этого
Код: java
1.
2.
3.
4.
Criteria crit = template.getSessionFactory().getCurrentSession().createCriteria(ObjName.class);
crit.createCriteria("obj1",CriteriaSpecification.LEFT_JOIN).add(Restrictions.gt("FLD12", new BigDecimal(someVariable)));
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return crit.list();


Так как результат отдаётся на отрисовку в web, то никакие дополнительные инициализации proxy не прокатят,
поэтому createCriteria("obj1",CriteriaSpecification.LEFT_JOIN)
И вот тут начинается засада. Он действительно выдаёт то что нужно, вот только объекты в коллекции которые
не удовлетворили критерии не инициализируются.
Т.е. там куда приходит объект этот сет имеет тип(как и положено) org.hibernate.collection.PersistentList и size()=2,
но по факту в ней только один объект, т.е. for() обречён на NullPointerException.

Собственно может я не знаю каких-то тонкостей, но мне нужно достать весь объект, т.е. со всеми объектами в коллекции,
не важно попали они под критерий или нет.
Если сделать поле не lazy="true" то всё работает штатно, но это же не кашерно.
Пока использую костыль в виде:
Код: java
1.
2.
3.
4.
5.
6.
7.
crit.createCriteria("obj1").add(Restrictions.gt("FLD12", new BigDecimal(someVariable)));
List<ObjName> l = crit.list();
        for(ObjName c : l) {
            Collection<Obj1> ll = c.getObj1List();
            ll.size();
        }
return l;



Гугл не помог, хотя может не о том вопрошал.

-----
Если дела идут плохо, есть вероятность, что в ближайшее время они пойдут ещё хуже.(с)Мерфи
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655470
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да просто не надо передавать в веб-слой энтити, надо VO туда отдавать, которые никак не связаны с хибером. Это с точки зрения "по уму".
А по вашей проблемы - не понятно, что такое FLD12 и что конкретно у вас не попадает в выборку. Объясните еще раз.
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655478
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverТ.е. там куда приходит объект этот сет имеет тип(как и положено) org.hibernate.collection.PersistentList и size()=2,
но по факту в ней только один объект, т.е. for() обречён на NullPointerException.

Что-то я тут вообще не вижу связи. Как null ссылка в коллекции обрекает вас на NPE? А SQL запрос вы тестировали? Может он не выбирает таки нужные ассоциации?

DDiverПока использую костыль в виде:

Окройте для себя Hibernate.initialize()

Так а что, этот "костыль" таки загружает зависимости?
Посмотрите
crit.setFetchMode("obj1", FetchMode.JOIN);

И откуда этот FLD12 ?
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655513
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По порядку :)
FLD12 это
Код: xml
1.
2.
3.
4.
5.
6.
7.
<hibernate-mapping package="xxx.yyy.zzz.objects">
    <class name="Obj1" table="OBJ1_TABLE">
...
<property name="FLD12" access="field"/>
...
</class>
</hibernate-mapping>



ПО поводу NPE.
Да собственно ни как :)
Да по SQL видно что он не выбирает те объекты, что не удовлетворили критерии.
Пробовал Hibernate.initialize(), но видимо в пылу экспериментов совсем про него позабыл. Собственно можно и так
Код: java
1.
2.
3.
for(ObjName c : l) {
            Hibernate.initialize(c.getObj1List());
}


FetchMode тоже пробовал, но это не избавляет от проблемы инициализации lazy коллекции.
Код: java
1.
2.
3.
crit.setFetchMode("obj1",FetchMode.JOIN);
crit.createAlias("obj1","obj1Alias");
crit.add(Restrictions.gt("obj1Alias.FLD12", new BigDecimal(someVariable)));



Можно конечно оставить и Hibernate.initialize(c.getObj1List()); но мне кажется что должен быть какой-то более изящный способ :)

Да, такой костыль полностью инициализирует коллекцию.
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655525
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл сказать, что нужно вытащить все объекты коллекции, т.к. нужно пересчитать в них суммы и получить общую по документу. Это помимо самих полей в ObjName.
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655529
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiver,
да нету тут изящного imho
- перед отдачей инит всего и вся разными способами
- VO\DTO перекачка из пустого в порожнее
- вторая модель для VIEW (последний писк у Net тчиков)
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655538
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverМожно конечно оставить и Hibernate.initialize(c.getObj1List()); но мне кажется что должен быть какой-то более изящный способ :)

Нормальный способ - сделать нормальный запрос. Потому как этот костыль чреват N+1.

Для начала попытайтесь обдумать ваш запрос на SQL.
Сейчас вы банально фильтруете по полю, из-за этого очевидно, что попадают только те ассоциации, которые удовлетворяют фильтру.
Вам же нужно сделать либо два джоина, либо подзапрос с IN.
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655548
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНормальный способ - сделать нормальный запрос. Потому как этот костыль чреват N+1.

Для начала попытайтесь обдумать ваш запрос на SQL.
Сейчас вы банально фильтруете по полю, из-за этого очевидно, что попадают только те ассоциации, которые удовлетворяют фильтру.
Вам же нужно сделать либо два джоина, либо подзапрос с IN.
На самом деле там не прямая установка значения.
В планах реализовать в GUI поиск по полям во всем объекте ObjName и его коллекциях. Поэтому заранее представить по каким именно полям будет искать пользователь мне кажется не возможно, с учётом того , что этих полей в объекте и всех подобъектах более сотни.
Именно из-за этого хочется использовать критерий, т.к. его гораздо проще конструировать, нежели мутить HQL.
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655550
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiver,
админка?
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655553
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverво всем объекте ObjName и его коллекциях
ну и до какого колена в коллекциях?
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655558
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123DDiver,
админка?
Нет.
Своеобразный документооборот.
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655561
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverНа самом деле там не прямая установка значения.
В планах реализовать в GUI поиск по полям во всем объекте ObjName и его коллекциях. Поэтому заранее представить по каким именно полям будет искать пользователь мне кажется не возможно, с учётом того , что этих полей в объекте и всех подобъектах более сотни.
Именно из-за этого хочется использовать критерий, т.к. его гораздо проще конструировать, нежели мутить HQL.
Сформулируйте свой запрос на SQL хотя бы примерно. Так как в терминах Criteria API вам пока сложно понять.
...
Рейтинг: 0 / 0
Hibernate выборка из lazy коллекции
    #37655602
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverPetro123DDiver,
админка?
Нет.
Своеобразный документооборот.
DDiverПоэтому заранее представить по каким именно полям будет искать пользователь мне кажется не возможно, с учётом того , что этих полей в объекте и всех подобъектах более сотни.
ты иди с другой стороны, например, как Blazkowicz тебе советует.
Или как это будет в ГУИ - сотни объектов +любой запрос по любой коллекции без ограничений
СЭД это непростая штука.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate выборка из lazy коллекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]