|
|
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
Собссно вопрос, где на практике могут пригодиться проекции? Я имею ввиду в боевых условиях. Смотрю на них и не понимаю, ну да прикольно среднее значение вытащить по столбцу и т.п. но.. зачем?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 07:52 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
andreykaT, Вопрос более чем страный. org.hibernate.criterion.Projections это часть Criteria API. Что логично следует из названия пакета. AVG, MAX, и прочее это часть SQL стандарта. Вас удивляет что Criteria API покрывает SQL стандарт? Вас удивляет наличие Criteria API в принципе? Мы, например, count часто использовали. У нас в ERP, как это обычно бывает, очень жирные формы поиска. По этим формам приходится строить динамические запросы, и Criteria API для этой задачи не заменим. Для реализации постраничной выборки, вполне логично посылать два запроса, один на количество, второй на сами записи. Переформулируйте вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 09:07 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, у меня вопрос такого плана. Есть приложение некое. Связанное с торговолей. в базе есть таблица склдаская прихода-ухода товара. просто таблица где содержатся сведения о том по какой цене пришел по какой цене ушел какое количество ну и собссно что за товар. теперь из этой таблы надо сделать отчет, типа топ продаваемых по количеству, топ продаваемых по прибыли, топ продаваемых по совокупному доходу и т.п. собссно у меня вопрос следующий: я это без проблем всё могу сделать средствами голой явы, ну там коллекциями-итерациями-стортировками и т.п. НО. тут вот есть мнение что на яве это делать уоще плохо и непрофессионально и делать надо это еще на уровне базы. т.е. либо голым сулем либо хибером с проекциями и т.п. а проблема в следующем: вот я смотрю и на проекции и на критерии в принципе, и что то у меня в голове никак не вырисовывается простое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 08:05 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
andreykaT, Отчеты лучше сразу делать нормально. На Pentaho или JasperReports + SQL, конечно же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 08:19 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, ну хорошо, но если забор не городить? т.е. по вашему мнению: ни хибер ни ява под эти дела не подходят? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 08:47 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
andreykaTну хорошо, но если забор не городить? т.е. по вашему мнению: ни хибер ни ява под эти дела не подходят? Pentaho и JasperReports написаны на Java. Они уже умеют всё то что вы можете написать самостоятельно и даже на много больше. Некоторые умудряются писать отчеты на HQL/Criteria API, но особого смысла я в этом не вижу. ORM нужен для CRUD. Отчеты - совсем другая история. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 08:49 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, я просто с жаспером не сталкивался.. может там действительно проще, но я не понимаю ну почему логику создания таких вот относительно "сложных" репортов проще делать в жаспере а не в яве описАть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 09:06 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
andreykaTя просто с жаспером не сталкивался.. может там действительно проще, но я не понимаю ну почему логику создания таких вот относительно "сложных" репортов проще делать в жаспере а не в яве описАть? Что такое "в яве описАть" мне не понятно. Проще там что любой мало-мальски успешный проект имеет тенденции к развитию и усложнению. Если вы не верите в проект, то зачем вы им занимаетесь. Если верите - то почему не хотите использовать готовые инструменты, которые закроют часть будущих требований на несколько лет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 09:12 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
описАть я подразумеваю в том контексте, что вот есть у тебя набор каких то данных в листе, тебе там надо что то сложить что то перемножить что то где то пересчитать, что-то вообще выбросить. следом сформировать уже новый лист и отправить его на вьюшку клиенту. Как то так я имею ввиду. Джаспер репортс - это отдельный инструмент и его как бы осваивать надо, а джаву вроде как уже всю знаешь. Я не ленюсь просто задаюсь вопросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 09:17 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
вот отличный вариант из жизни : Есть таблица из которой вам нужно вытащить n последних операций по пользователю и терминалу : Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. вот код который создает айбернет для выборки 1 последней записи ... чтобы это все работало быстро нужно добавить индекс на три поля Код: sql 1. Код: sql 1. 2. 3. 4. 5. в mysql его EXPLAIN говорит о том что все ок ! .... минус такого запроса в том что у нас есть индекс большой и сложный и операция order by для выборки одной записи ... очень много записей нужно просмотреть ...даже использую индекс где то можно все это оптимизировать и если нам в 90 % случаях нужна 1 запись - то пишем нечто такое .... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. что очень сильно улучшаешь вам жизнь .... код на айбернейте для данного запроса прошу написать вам :) для самопроверки и понимания . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 12:07 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
session.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 12:15 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
Atum, по SQL. Убрал в spoiler, т.к. много букв: Atum1....чтобы это все работало быстро нужно добавить индекс на три поля CREATE INDEX `idx_login_terminalId_creationDate` ON `LastOperation` (login, terminalId, creationDate) ... order by this_.creationDate desc limit 1; ... минус такого запроса в том что у нас есть индекс большой и сложный и операция order by для выборки одной записи ... очень много записей нужно просмотреть ...даже использую индекс Пользуйтесь правильными СУБД и умейти их готовить. Нормальные СУБД вполне order by по индексу умеют, т.ч. обращение может/должно быть всегда к одной записи. С MySQL работал очень давно ((( В Oracle - order by может потребовать явного хинтования (INDEX_ASC, INDEX_DESC). Первый попавшийся кусок из доки по PostgreSQL https://www.postgresql.org/docs/8.3/static/indexes-ordering.html "" IMHO & AFAIK Код: sql 1. 2. 3. 4. что очень сильно улучшаешь вам жизнь .... На мой взгляд, первый запрос намного более "правильный". C join, можно словить ряд приятность, если creationDate не уникальная. В данном случае, с limit 1 это не проявится, но лично я такие конструкции не люблю. В знакомых мне СУБД, max/min ничем не лучше order by с limit. Мне даже кажется, что в Oracle, этот вариант будет намного хуже. ==== Посмотрел первую попавшуюся доку по MySQL (перевод ужасный ((( половину примеров я не понял) http://www.mysql.ru/docs/man/ORDER_BY_optimisation.html подозреваю, что скорее всего, проблема с indexes и order by связана с пунктом: "...Столбцы индекса могут содержать значения NULL, и используется ORDER BY ... DESC. Это объясняется тем, что в SQL значения NULL всегда сортируются в первую очередь, независимо от того, используется DESC или нет...." Точно не знаю, могу высказать только предположение. IMHO. Плотно работал только с Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 12:33 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
andreykaTsession.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult(); тут перекладывание части работы субд на java, что само по себе не оптимально. хоть и выглядит красиво - одна строка, но за этим фантиком скрыто куча лишних действий системы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 12:43 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
вадяandreykaTsession.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult(); тут перекладывание части работы субд на java, что само по себе не оптимально. хоть и выглядит красиво - одна строка, но за этим фантиком скрыто куча лишних действий системы и что и что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 12:49 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
andreykaTвадяпропущено... тут перекладывание части работы субд на java, что само по себе не оптимально. хоть и выглядит красиво - одна строка, но за этим фантиком скрыто куча лишних действий системы и что и что? и то и то голову включи. сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 13:01 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
По доке setMaxResults эквивалентно limit. Это НЕ setFetchSize. Т.ч. разницы быть не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 13:05 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
вадяandreykaTпропущено... и что и что? и то и то голову включи. сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение. серьезно? вам бы почитать как хибернейт работает. можно еще логи sql включить и посмотреть что реально в БД будет выполняться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 13:09 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
вадятут перекладывание части работы субд на java, что само по себе не оптимально. хоть и выглядит красиво - одна строка, ... сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение. Вадя, ты просто набор каких-то домыслов, суеверий и заблуждений. В цитате выше в каждом предложении присутствует заблуждение. И при этом советуешь кому-то ещё "голову включать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 13:15 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
Penkov Vladimirсерьезно? вам бы почитать как хибернейт работает. можно еще логи sql включить и посмотреть что реально в БД будет выполняться Он из принципа считает что ORM не нужен. При этом никогда его не использовал и понятия не имеет как он работает. Переубеждать бесполезно. Очередной Hibernate срач будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 13:16 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevAtum, по SQL. Убрал в spoiler, т.к. много букв: Atum1....чтобы это все работало быстро нужно добавить индекс на три поля CREATE INDEX `idx_login_terminalId_creationDate` ON `LastOperation` (login, terminalId, creationDate) ... order by this_.creationDate desc limit 1; ... минус такого запроса в том что у нас есть индекс большой и сложный и операция order by для выборки одной записи ... очень много записей нужно просмотреть ...даже использую индекс Пользуйтесь правильными СУБД и умейти их готовить. Нормальные СУБД вполне order by по индексу умеют, т.ч. обращение может/должно быть всегда к одной записи. С MySQL работал очень давно ((( В Oracle - order by может потребовать явного хинтования (INDEX_ASC, INDEX_DESC). Первый попавшийся кусок из доки по PostgreSQL https://www.postgresql.org/docs/8.3/static/indexes-ordering.html "" IMHO & AFAIK Код: sql 1. 2. 3. 4. что очень сильно улучшаешь вам жизнь .... На мой взгляд, первый запрос намного более "правильный". C join, можно словить ряд приятность, если creationDate не уникальная. В данном случае, с limit 1 это не проявится, но лично я такие конструкции не люблю. В знакомых мне СУБД, max/min ничем не лучше order by с limit. Мне даже кажется, что в Oracle, этот вариант будет намного хуже. ==== Посмотрел первую попавшуюся доку по MySQL (перевод ужасный ((( половину примеров я не понял) http://www.mysql.ru/docs/man/ORDER_BY_optimisation.html подозреваю, что скорее всего, проблема с indexes и order by связана с пунктом: "...Столбцы индекса могут содержать значения NULL, и используется ORDER BY ... DESC. Это объясняется тем, что в SQL значения NULL всегда сортируются в первую очередь, независимо от того, используется DESC или нет...." Точно не знаю, могу высказать только предположение. IMHO. Плотно работал только с Oracle тут нужно написать тот и тот запрос на таблице в 1 млн записей ... в которой по данным параметрам терминал ил огин будет по 100 т записей и построить EXPLAIN посмотреть время - замерить ... потом добавить индексы - замерить ... потом сравнить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 13:44 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
andreykaTsession.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult(); нужно смотреть какой код будет генериться в логах ... и писать тесты и EXPLAIN делать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 13:45 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
авторВадя, ты просто набор каких-то домыслов, суеверий и заблуждений. В цитате выше в каждом предложении присутствует заблуждение. И при этом советуешь кому-то ещё "голову включать". если какая-то прокладка session.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult(); в строку sql вставляет что-то своё это ещё один повод говорить, что прокладка не нужна и как с этой прокладкой производить оптимизацию исследовать EXPLAIN ... кто хочет пусть пользуется, я мозахизмом не занимаюсь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 14:03 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
возвращаясь к теме ) Открыл я этот джаспер репортс и понял, что на вид это какой то полу-шаблонизатор полу-язык разметки. :) т.е. всё с нуля осваивать. А как оно вообще работает? Он там как то хитро выстраивает скл запросы а потом красиво всё раскладывает, или же просто в себя вбирает тупо коллекции и так же их там пересчитывает-перекладывает и выкладывает на "вьюшки"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 16:10 |
|
||
|
Hibernate проекции
|
|||
|---|---|---|---|
|
#18+
вадяandreykaTпропущено... и что и что? и то и то голову включи. сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение. с ума сойти. я канеш понимаю что хибер вроде опенсорса и там каждый школоло может понатворить дел. хотя, по честноку я сомневаюсь. И. Я не думаю что атм всё так сильно запущено :) тогда уж проще листом всю таблицу вытащить а потом гетнуть по индексу последнее значение. ))) Вадим, ну реально разницы нет между тем что ты сказал и то, что я описал только что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2016, 17:11 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39251624&tid=2123730]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
133ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 494ms |

| 0 / 0 |
