|
|
|
Простейший 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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37755840&tid=2132020]: |
0ms |
get settings: |
8ms |
get forum list: |
23ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 334ms |
| total: | 519ms |

| 0 / 0 |
