|
|
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть sql запрос подобного вида (запрос сильно упрощен для изложеняи сути вопроса): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код java класса: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. Проблема в том, что не получается правильно получить результат, либо не достаеться вообще нчиего, либо дотается Article, но переменные подклассов в Article (.getCity(), .getContentType()) оказываются NULL. Пробовал указывать через .addEntity("cn", CityNames.class) и .addJoin("CityNames","PageContent.city"), но видимо ещё не постиг дао Гибернейта. Прошу помощи :) Спасибо за ответы. P.S. Запрос нужно оставить в чистом sql виде по некоторым причинам (реализация кэша, нетривиальная секция WHERE). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 05:34 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
Не получается отредактировать сообщение, в первом листинге есстественно маппинг указан: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 05:40 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
Вполне ожидаемо при использовании SQL запроса. Используйте HQL и Criteria API вместо этого. Для управления гибкого управления ассоциациями используйте Fetch Mode. Или зачем вам вообще Hibernate если вы все Join-ы хотите вручную писать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 11:02 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИли зачем вам вообще Hibernate Для кэширования первого/второго уровней. Blazkowiczвы все Join-ы хотите вручную писать? Потому что в сильнонагруженной базе данных вручную оптимизированный запрос будет исполняться быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2014, 02:43 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
arkham.vmBlazkowiczИли зачем вам вообще Hibernate Для кэширования первого/второго уровней. Blazkowiczвы все Join-ы хотите вручную писать? Потому что в сильнонагруженной базе данных вручную оптимизированный запрос будет исполняться быстрее. 1)@OneToOne - измените модель базы данных. 2)Хм... опишите свой запрос на HQL - включите дебаг - посмотрите какого вида будет запрос генерировать hibernate. 3)Не используйте hibernate - введите DAO объекты . 4)Используйте jdbctemplate. 5)Опишите Ваш sql как процедуру - вызывайте процедуру ( для скорости ): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2014, 09:52 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
arkham.vmДля кэширования первого/второго уровней. Для кеширования можно просто прикрутить кэш. Первый уровень между логикой и слоем обращения к базе. Второй уровень между слоем обращения к базе и самой базой. Тот же myBatis чего было не взять, если вас так прет на pure SQL всё делать? arkham.vmПотому что в сильнонагруженной базе данных вручную оптимизированный запрос будет исполняться быстрее. Ерунда. FetchMode точно так же управляет вашими запросами, при том что предоставляет лёгкий способ поменять JOIN на 2 SELECT запроса или обратно. А на pure SQL вам нужно будет тупо полностью переписывать запрос, чтобы поиметь вместо толстого JOIN несколько мелких зарпосов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2014, 11:10 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
Atum11)@OneToOne - измените модель базы данных. Не думаю что автор темы поймет о чем речь. Atum12)Хм... опишите свой запрос на HQL - включите дебаг - посмотрите какого вида будет запрос генерировать hibernate. +1 Atum13)Не используйте hibernate - введите DAO объекты . Ни о чем. Возможно имелось ввиду, "не искпользуйте Hibernate API из слоя бизнес логики напрямую. Оберните всё в отдельный слой DAO"? Вопрос спорный. Atum14)Используйте jdbctemplate. jdbctemplate тут накой? Atum15)Опишите Ваш sql как процедуру - вызывайте процедуру ( для скорости ): Это никак не исправит проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2014, 11:13 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
Atum1, Blazkowicz, спасибо за ответы. Я бы с удовольствием отклонился от заданной архитектуры, если бы проект был новым а не n-летней давности. Так что советы в этом плане хоть и полезны, но в данном случае бессмысленны. автор1)@OneToOne - измените модель базы данных. Изначально там был @ManyToOne, в соответсвии с моделью данных, но с данной аннотацией маппинг выполняться вообще не пожелал. автор2)Хм... опишите свой запрос на HQL - включите дебаг - посмотрите какого вида будет запрос генерировать hibernate. Запрос изначально был на Hibernate функциях Restrictions/Criteria. Включил дебаг, взял сгенеренный запрос, и переписал на более быстрый ручной. автор3)Не используйте hibernate - введите DAO объекты . Возможно имелось ввиду, "не искпользуйте Hibernate API из слоя бизнес логики напрямую. Оберните всё в отдельный слой DAO"? Hibernate API как раз таки и вызывается только из DAO Layer. автор4)Используйте jdbctemplate. Если я правильно понял, это аналог трансформеров гибернета, использовать в проекте то одно то другое не очень хочеться, желательно сохранить общий стиль. автор5)Опишите Ваш sql как процедуру - вызывайте процедуру ( для скорости ): Проблема не в том как выполнить запрос, пробелма в том, что бы ResultSet правильно странсформировался не только в нужный класс объекта (Article.class), но и используемые в объекте подклассы (ContentType.class, City.class). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2014, 03:18 |
|
||
|
Hibernate чистый sql: маппинг для подклассов (join entity/table)
|
|||
|---|---|---|---|
|
#18+
arkham.vmBlazkowiczИли зачем вам вообще Hibernate Для кэширования первого/второго уровней.Blazkowiczвы все Join-ы хотите вручную писать? Потому что в сильнонагруженной базе данных вручную оптимизированный запрос будет исполняться быстрее. Налицо явное заблужение, даже несколько - в native SQL запросах кеширование не используется, скорее всего, и его результаты не попадут в кеш - парсер hibernate достаточно хорошо оптимизирован, и вряд ли получится написать запрос оптимальнее, чем это делает hibernate. В документации рекомендуют применять SQL только для использования фич конкретной СУБД. Естественно, при неправильном маппинге может быть все что угодно. Можете объяснить, в чем заключалась изначальная неоптимальность запроса из Restrictions/Criteria? Может, достаточно было указаить правильный Fetch Mode? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2014, 09:27 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38532732&tid=2127775]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
193ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 549ms |

| 0 / 0 |
