|
|
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Хочу получить записи в количестве n, начиная с записи m, т.е. что-то типа select * from testtable where visible = true order by id limit 0,5 Короче говоря, первые пять записей таблицы. Делаю вот так: Код: java 1. 2. 3. 4. Получаю список с повторяющимися элементами, причем количество повторений для разных id разное. Как сделать правильно? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 16:57:20 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
для limit нужно использовать setFirst() setMax(), дословно синтаксис не помню - поищите методы а для ограничения дубликатов - есть то ли баг то ли фича хибернейта, я в другой ветке обсуждал, возможно надо переписать запрос через hql. Но сначала попробуйте методы вначалае и отпишитесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:12:39 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл ник, это если запрос через HQL писать, то там да, через set*() задается. Но мне интересно именно через Criteria. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:15:18 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл ник, я что-то в обертке Spring hibernateTemplate такого вообще не нахожу, я про setMax/First. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:18:14 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл ник, и у меян в базе нет дубликатов) id | visible | name 1 true Дима1 2 true Дима2 3 true Дима3 4 true Дима4 5 true Дима5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:21:12 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdmзабыл ник, и у меян в базе нет дубликатов) id | visible | name 1 true Дима1 2 true Дима2 3 true Дима3 4 true Дима4 5 true Дима5 Я не про базу - при определенных условиях, критерия возвращает дубликаты, там довольно долго обьяснять, если будет время напишу подробнее. Насчет setFirst setMax - не работал через spring template, в обычном хибернейт это делается так Criteria criteria = session.createCriteria(Student.class); criteria.setFirstResult(1); Если таких методовдействительно нет - то имхо чет они замутили, надо гуглить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:25:32 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
у тебя join на images, при связи 1:N или N:M limit X,Y начинает играть совсем другими красками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:25:48 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
chpasha, я догадывался об этом) но все таки как сделать чтобы это просто работало) ведь запрос то простейший, почему возникают такие сложности? ) Толи я дурак, то ли хибернате мудрит на пустом месте) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:28:51 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdm, пейджинг перестает работать при eager fetch. Попробуй FetchMode.SELECT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:29:58 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
vas0, получается классика с LazyInitializationException ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:33:46 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Заметил такую особенность, что запрос перестает правильно работать при addOrder(Order.desc("id"). Т.е. если убрать эту запись выборка правильная) Но мне нужно именно desc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:46:55 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdmЗаметил такую особенность, что запрос перестает правильно работать при addOrder(Order.desc("id"). Т.е. если убрать эту запись выборка правильная) Но мне нужно именно desc. Скорее всего у тебя при порядке аsc идут коллекции images, в которых не больше одного элемента. А при desc, есть коллекции images с несколькими элементами и получаешь такое декартого произведение: event1 image1 event1 image2 event1 image3 event2 image1 event3 image1 event4 image1 event5 image1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 17:54:48 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Сделал вот так, вроде работает. Хотя печально все это) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:16:48 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdmchpasha, я догадывался об этом) но все таки как сделать чтобы это просто работало) ведь запрос то простейший, почему возникают такие сложности? ) Толи я дурак, то ли хибернате мудрит на пустом месте) setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:20:32 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, не сработало, пробывал) и new org.hibernate.transform.DistinctRootEntityResultTransformer() и тоже) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:23:18 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdmBlazkowicz, не сработало, пробывал) и new org.hibernate.transform.DistinctRootEntityResultTransformer() и тоже) У нас вот так работает без проблем: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:28:53 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, сейчас попробую) Я ошибся, CriteriaSpecification.DISTINCT_ROOT_ENTITY не пробовал ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:33:10 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Работает distinct, но не setMaxResults(), setFirstResult(). Из-за того что в запросе есть fetch join получаем декартого произведение и пейджинг перестает правильно работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:33:26 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdm, И он не будет работать ни в Criteria API ни в HQL, так что твой код, по моему, работает неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:36:03 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
vas0Работает distinct, но не setMaxResults(), setFirstResult(). Из-за того что в запросе есть fetch join получаем декартого произведение и пейджинг перестает правильно работать. А... А почему HQL тогда заработал вдруг? Тогда через подзапрос можно сделать: http://floledermann.blogspot.com/2007/10/solving-hibernate-criterias-distinct.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:39:11 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Все зависит от данных. На некоторых может показаться что все работает правильно. Допустим отношение event/image, если у каждого event в коллекции будет по одному image. При fetch join можем получить такое декартово произведение: event1 image1 event2 image2 event3 image3 Если же попадутся коллекции с более чем одним image, то можем получить: event1 image1 event1 image2 event1 image3 Persistence with HibernateQuery execution options that are based on the SQL result rows, such as pagination with setMaxResults()/setFirstResult(), are semantically incorrect if a collection is eagerly fetched. If you have an eager fetched collection in your query, at the time of writing, Hibernate falls back to limiting the result in-memory, instead of using SQL. This may be less efficient, so we don’t recommend the use of JOIN FETCH with setMaxResults()/set- FirstResult(). Future versions of Hibernate may fall back to a different SQL query strategy (such as two queries and subselect fetching) if setMaxResults()/ setFirstResult() is used in combination with a JOIN FETCH. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:49:36 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, не работает( пробовал и hibernate session и hibernateTemplate. Я думаю дело в том, что в вашем примере нет Order и setMaxResult/setFirstResult. Так что увы, но у меня ничего кроме голого HQL не работает правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:52:01 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
vas0rdm, И он не будет работать ни в Criteria API ни в HQL, так что твой код, по моему, работает неправильно. у меня в таблице 4 записи event (id = 1,2,3,4) 1 event -> 6 записей в таблице image 2 event -> 3 записи image 3 event -> 8 записей image 4 event -> 4 записи image отношения между Event и Image - OneToMany На таких данных HQL запрос работает правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 18:56:28 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ваш вариант "почти" работает) У некоторых обьектов event список image правильный, а у одного (последнего) состоит только из одного объекта Image вместо 8) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 19:03:14 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Делайте через подзапрос. Внутрений запрос с порядком и пэйджингом только по главной энтити. А внешний запрос с джоином. Подзапросы на Criteria API через DetachedCriteria делаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 19:06:51 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
при HQL запросе(который как я писал выше работает правильно), hibernate выдает следующее: Hibernate: select event*...., images*..., from event left outer join image on event.id=images.parent_id where event.event_visible=1 order by event.id desc Как я понял Limit'а тут нет, т.е. он что все записи считывает? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 19:29:10 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, мне кажется тогда уж проще вот так. Не прав? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 19:57:00 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdmBlazkowicz, мне кажется тогда уж проще вот так. Не прав? Это N+1 запросов на каждую страницу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 20:46:45 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, я не совсем понял как сделать авторДелайте через подзапрос. Внутрений запрос с порядком и пэйджингом только по главной энтити. А внешний запрос с джоином. Подзапросы на Criteria API через DetachedCriteria делаются. Не могли бы вы привести пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 21:38:24 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdmНе могли бы вы привести пример. Уже: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=934603&msg=12424031 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 21:45:21 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДелайте через подзапрос. Внутрений запрос с порядком и пэйджингом только по главной энтити. А внешний запрос с джоином. Подзапросы на Criteria API через DetachedCriteria делаются. Я смотрел) Видимо не увидел среди английских фраз то что вы имели ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 21:53:24 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Пойду разберусь) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 22:02:43 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrdmНе могли бы вы привести пример. Уже: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=934603&msg=12424031 Пока я что-то не очень понял этот пример) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2012, 23:39:56 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, не получилось вообщем, не понял. Возвращается множество, о котором писал vas0. Но) Пока писал это сообщение нашел вот такое решение: Код: 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. 52. 53. 54. 55. 56. В логе хибернейт пишет 2 запроса: Код: sql 1. 2. 3. Вроде бы правильно? Я прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 03:23:50 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
rdmВроде бы правильно? Я прав? Что-то похожее, но, в теории, можно ведь вместо списка и подзапросом сделать WHERE Event.ID IN (SELECT ID FROM ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 10:15:06 |
|
||
|
Простейший SQL запрос Hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrdmВроде бы правильно? Я прав? Что-то похожее, но, в теории, можно ведь вместо списка и подзапросом сделать WHERE Event.ID IN (SELECT ID FROM ...) Я такой запрос пробовал на SQL, первый работает, а второй нет. Пишет "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'" Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2012, 11:11:39 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2132020]: |
0ms |
get settings: |
16ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
70ms |
get topic data: |
20ms |
get forum data: |
6ms |
get page messages: |
96ms |
get tp. blocked users: |
3ms |
| others: | 334ms |
| total: | 585ms |

| 0 / 0 |
