|
|
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Наткнулся недавно на очень интересный момент в хибере. Баг это или фича я не знаю. есть маппинг объекта Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. нужно выбрать такие ObjName из БД у которых в коллекции присутствует obj1, одно из полей которого удовлетворяет какому-либо условия. Собственно сам код для этого Код: java 1. 2. 3. 4. Так как результат отдаётся на отрисовку в 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. Гугл не помог, хотя может не о том вопрошал. ----- Если дела идут плохо, есть вероятность, что в ближайшее время они пойдут ещё хуже.(с)Мерфи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 11:33:37 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
Да просто не надо передавать в веб-слой энтити, надо VO туда отдавать, которые никак не связаны с хибером. Это с точки зрения "по уму". А по вашей проблемы - не понятно, что такое FLD12 и что конкретно у вас не попадает в выборку. Объясните еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 11:37:54 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
DDiverТ.е. там куда приходит объект этот сет имеет тип(как и положено) org.hibernate.collection.PersistentList и size()=2, но по факту в ней только один объект, т.е. for() обречён на NullPointerException. Что-то я тут вообще не вижу связи. Как null ссылка в коллекции обрекает вас на NPE? А SQL запрос вы тестировали? Может он не выбирает таки нужные ассоциации? DDiverПока использую костыль в виде: Окройте для себя Hibernate.initialize() Так а что, этот "костыль" таки загружает зависимости? Посмотрите crit.setFetchMode("obj1", FetchMode.JOIN); И откуда этот FLD12 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 11:44:15 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
По порядку :) FLD12 это Код: xml 1. 2. 3. 4. 5. 6. 7. ПО поводу NPE. Да собственно ни как :) Да по SQL видно что он не выбирает те объекты, что не удовлетворили критерии. Пробовал Hibernate.initialize(), но видимо в пылу экспериментов совсем про него позабыл. Собственно можно и так Код: java 1. 2. 3. FetchMode тоже пробовал, но это не избавляет от проблемы инициализации lazy коллекции. Код: java 1. 2. 3. Можно конечно оставить и Hibernate.initialize(c.getObj1List()); но мне кажется что должен быть какой-то более изящный способ :) Да, такой костыль полностью инициализирует коллекцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:03:07 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
Забыл сказать, что нужно вытащить все объекты коллекции, т.к. нужно пересчитать в них суммы и получить общую по документу. Это помимо самих полей в ObjName. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:05:51 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
DDiver, да нету тут изящного imho - перед отдачей инит всего и вся разными способами - VO\DTO перекачка из пустого в порожнее - вторая модель для VIEW (последний писк у Net тчиков) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:07:28 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
DDiverМожно конечно оставить и Hibernate.initialize(c.getObj1List()); но мне кажется что должен быть какой-то более изящный способ :) Нормальный способ - сделать нормальный запрос. Потому как этот костыль чреват N+1. Для начала попытайтесь обдумать ваш запрос на SQL. Сейчас вы банально фильтруете по полю, из-за этого очевидно, что попадают только те ассоциации, которые удовлетворяют фильтру. Вам же нужно сделать либо два джоина, либо подзапрос с IN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:10:00 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНормальный способ - сделать нормальный запрос. Потому как этот костыль чреват N+1. Для начала попытайтесь обдумать ваш запрос на SQL. Сейчас вы банально фильтруете по полю, из-за этого очевидно, что попадают только те ассоциации, которые удовлетворяют фильтру. Вам же нужно сделать либо два джоина, либо подзапрос с IN. На самом деле там не прямая установка значения. В планах реализовать в GUI поиск по полям во всем объекте ObjName и его коллекциях. Поэтому заранее представить по каким именно полям будет искать пользователь мне кажется не возможно, с учётом того , что этих полей в объекте и всех подобъектах более сотни. Именно из-за этого хочется использовать критерий, т.к. его гораздо проще конструировать, нежели мутить HQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:19:38 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
DDiver, админка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:21:40 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
DDiverво всем объекте ObjName и его коллекциях ну и до какого колена в коллекциях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:23:09 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
Petro123DDiver, админка? Нет. Своеобразный документооборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:25:40 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
DDiverНа самом деле там не прямая установка значения. В планах реализовать в GUI поиск по полям во всем объекте ObjName и его коллекциях. Поэтому заранее представить по каким именно полям будет искать пользователь мне кажется не возможно, с учётом того , что этих полей в объекте и всех подобъектах более сотни. Именно из-за этого хочется использовать критерий, т.к. его гораздо проще конструировать, нежели мутить HQL. Сформулируйте свой запрос на SQL хотя бы примерно. Так как в терминах Criteria API вам пока сложно понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:27:02 |
|
||
|
Hibernate выборка из lazy коллекции
|
|||
|---|---|---|---|
|
#18+
DDiverPetro123DDiver, админка? Нет. Своеобразный документооборот. DDiverПоэтому заранее представить по каким именно полям будет искать пользователь мне кажется не возможно, с учётом того , что этих полей в объекте и всех подобъектах более сотни. ты иди с другой стороны, например, как Blazkowicz тебе советует. Или как это будет в ГУИ - сотни объектов +любой запрос по любой коллекции без ограничений СЭД это непростая штука. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2012, 12:40:39 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=310&tid=2132601]: |
0ms |
get settings: |
17ms |
get forum list: |
17ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 376ms |
| total: | 526ms |

| 0 / 0 |
