powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate проекции
25 сообщений из 60, страница 1 из 3
Hibernate проекции
    #39250994
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собссно вопрос, где на практике могут пригодиться проекции? Я имею ввиду в боевых условиях. Смотрю на них и не понимаю, ну да прикольно среднее значение вытащить по столбцу и т.п. но.. зачем??
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251010
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,

Вопрос более чем страный. org.hibernate.criterion.Projections это часть Criteria API. Что логично следует из названия пакета. AVG, MAX, и прочее это часть SQL стандарта. Вас удивляет что Criteria API покрывает SQL стандарт? Вас удивляет наличие Criteria API в принципе?

Мы, например, count часто использовали. У нас в ERP, как это обычно бывает, очень жирные формы поиска. По этим формам приходится строить динамические запросы, и Criteria API для этой задачи не заменим. Для реализации постраничной выборки, вполне логично посылать два запроса, один на количество, второй на сами записи.

Переформулируйте вопрос.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251606
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

у меня вопрос такого плана. Есть приложение некое. Связанное с торговолей. в базе есть таблица склдаская прихода-ухода товара. просто таблица где содержатся сведения о том по какой цене пришел по какой цене ушел какое количество ну и собссно что за товар.

теперь из этой таблы надо сделать отчет, типа топ продаваемых по количеству, топ продаваемых по прибыли, топ продаваемых по совокупному доходу и т.п.

собссно у меня вопрос следующий: я это без проблем всё могу сделать средствами голой явы, ну там коллекциями-итерациями-стортировками и т.п.

НО. тут вот есть мнение что на яве это делать уоще плохо и непрофессионально и делать надо это еще на уровне базы. т.е. либо голым сулем либо хибером с проекциями и т.п.

а проблема в следующем: вот я смотрю и на проекции и на критерии в принципе, и что то у меня в голове никак не вырисовывается простое решение.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251612
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,

Отчеты лучше сразу делать нормально. На Pentaho или JasperReports + SQL, конечно же.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251622
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

ну хорошо, но если забор не городить? т.е. по вашему мнению: ни хибер ни ява под эти дела не подходят?
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251624
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTну хорошо, но если забор не городить? т.е. по вашему мнению: ни хибер ни ява под эти дела не подходят?
Pentaho и JasperReports написаны на Java. Они уже умеют всё то что вы можете написать самостоятельно и даже на много больше.
Некоторые умудряются писать отчеты на HQL/Criteria API, но особого смысла я в этом не вижу. ORM нужен для CRUD. Отчеты - совсем другая история.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251641
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

я просто с жаспером не сталкивался.. может там действительно проще, но я не понимаю ну почему логику создания таких вот относительно "сложных" репортов проще делать в жаспере а не в яве описАть?
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251648
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTя просто с жаспером не сталкивался.. может там действительно проще, но я не понимаю ну почему логику создания таких вот относительно "сложных" репортов проще делать в жаспере а не в яве описАть?
Что такое "в яве описАть" мне не понятно. Проще там что любой мало-мальски успешный проект имеет тенденции к развитию и усложнению. Если вы не верите в проект, то зачем вы им занимаетесь. Если верите - то почему не хотите использовать готовые инструменты, которые закроют часть будущих требований на несколько лет?
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251649
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
описАть я подразумеваю в том контексте, что вот есть у тебя набор каких то данных в листе, тебе там надо что то сложить что то перемножить что то где то пересчитать, что-то вообще выбросить. следом сформировать уже новый лист и отправить его на вьюшку клиенту. Как то так я имею ввиду.

Джаспер репортс - это отдельный инструмент и его как бы осваивать надо, а джаву вроде как уже всю знаешь. Я не ленюсь просто задаюсь вопросом.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251789
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот отличный вариант из жизни :

Есть таблица из которой вам нужно вытащить n последних операций по пользователю и терминалу :


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    @Override
    @Transactional
    public LastOperation getLastOperation(long login, long terminalId , int  firstResult) {
        DetachedCriteria criteria = DetachedCriteria.forClass(LastOperation.class);
       
        criteria.add(Restrictions.eq("login", login));
        criteria.add(Restrictions.eq("terminalId", terminalId));
        criteria.addOrder(Order.desc("creationDate"));
        List<?> items = getByCriteria(criteria, firstResult, 1);
        if (items == null || items.isEmpty()) {
            return null;
        }
        return (LastOperation) items.get(0);
    }



вот код который создает айбернет для выборки 1 последней записи ...

чтобы это все работало быстро нужно добавить индекс на три поля

Код: sql
1.
CREATE INDEX `idx_login_terminalId_creationDate`  ON `LastOperation` (login, terminalId, creationDate)



Код: sql
1.
2.
3.
4.
5.
 select this_.`transactionId` as transact1_2_0_, this_.creationDate as
creation2_2_0_, this_.login as login2_0_, this_.terminalId as
terminalId2_0_, this_.`LastOperation` as
 ticketFo5_2_0_ from `LastOperation` this_ where this_.login=****
 and this_.terminalId=**** order by this_.creationDate desc limit 1;



в mysql его EXPLAIN говорит о том что все ок ! ....
минус такого запроса в том что у нас есть индекс большой и сложный и операция order by для выборки одной записи ...

очень много записей нужно просмотреть ...даже использую индекс


где то можно все это оптимизировать и если нам в 90 % случаях нужна 1 запись - то пишем нечто такое ....



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXPLAIN
select s1.* from LastOperation s1
join
(select max(creationDate) as m_creationDate from LastOperation
where 1 = 1
and login=***** 
and terminalId=*****  ) t1 on s1.creationDate = t1.m_creationDate 
where 1 = 1
and s1.login=*****  
and s1.terminalId=***** 
limit 1;



что очень сильно улучшаешь вам жизнь ....

код на айбернейте для данного запроса прошу написать вам :) для самопроверки и понимания .
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251799
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
session.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult();
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251813
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
select s1.* from LastOperation s1
join
(select max(creationDate) as m_creationDate from LastOperation
...



что очень сильно улучшаешь вам жизнь ....

На мой взгляд, первый запрос намного более "правильный". 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
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251826
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTsession.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult();
тут перекладывание части работы субд на java, что само по себе не оптимально.
хоть и выглядит красиво - одна строка,
но за этим фантиком скрыто куча лишних действий системы
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251843
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяandreykaTsession.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult();
тут перекладывание части работы субд на java, что само по себе не оптимально.
хоть и выглядит красиво - одна строка,
но за этим фантиком скрыто куча лишних действий системы
и что и что?
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251862
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTвадяпропущено...

тут перекладывание части работы субд на java, что само по себе не оптимально.
хоть и выглядит красиво - одна строка,
но за этим фантиком скрыто куча лишних действий системы
и что и что?
и то и то
голову включи.
сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251869
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По доке setMaxResults эквивалентно limit. Это НЕ setFetchSize.

Т.ч. разницы быть не должно.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251872
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяandreykaTпропущено...

и что и что?
и то и то
голову включи.
сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение.

серьезно? вам бы почитать как хибернейт работает.
можно еще логи sql включить и посмотреть что реально в БД будет выполняться
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251879
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадятут перекладывание части работы субд на java, что само по себе не оптимально.
хоть и выглядит красиво - одна строка,
...
сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение.
Вадя, ты просто набор каких-то домыслов, суеверий и заблуждений. В цитате выше в каждом предложении присутствует заблуждение.
И при этом советуешь кому-то ещё "голову включать".
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251881
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Penkov Vladimirсерьезно? вам бы почитать как хибернейт работает.
можно еще логи sql включить и посмотреть что реально в БД будет выполняться
Он из принципа считает что ORM не нужен. При этом никогда его не использовал и понятия не имеет как он работает. Переубеждать бесполезно. Очередной Hibernate срач будет.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251923
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
select s1.* from LastOperation s1
join
(select max(creationDate) as m_creationDate from LastOperation
...



что очень сильно улучшаешь вам жизнь ....

На мой взгляд, первый запрос намного более "правильный". 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

посмотреть время - замерить ...

потом добавить индексы - замерить ...

потом сравнить
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251925
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTsession.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult();


нужно смотреть какой код будет генериться в логах ... и писать тесты и EXPLAIN делать :)
...
Рейтинг: 0 / 0
Hibernate проекции
    #39251945
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВадя, ты просто набор каких-то домыслов, суеверий и заблуждений. В цитате выше в каждом предложении присутствует заблуждение.
И при этом советуешь кому-то ещё "голову включать".


если какая-то прокладка
session.createQuery("from mytable ORDER BY id DESC").setMaxResults(1).uniqueResult();
в строку sql вставляет что-то своё это ещё один повод говорить, что прокладка не нужна
и как с этой прокладкой производить оптимизацию исследовать EXPLAIN ...
кто хочет пусть пользуется, я мозахизмом не занимаюсь
...
Рейтинг: 0 / 0
Hibernate проекции
    #39252137
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возвращаясь к теме ) Открыл я этот джаспер репортс и понял, что на вид это какой то полу-шаблонизатор полу-язык разметки. :)
т.е. всё с нуля осваивать. А как оно вообще работает? Он там как то хитро выстраивает скл запросы а потом красиво всё раскладывает, или же просто в себя вбирает тупо коллекции и так же их там пересчитывает-перекладывает и выкладывает на "вьюшки"?
...
Рейтинг: 0 / 0
Hibernate проекции
    #39252205
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяandreykaTпропущено...

и что и что?
и то и то
голову включи.
сначала в субд отсортируешь , потом передаёшь в java, там перебираешь весь объём, чтоб найти максимум и выбираешь 1 значение.
с ума сойти. я канеш понимаю что хибер вроде опенсорса и там каждый школоло может понатворить дел. хотя, по честноку я сомневаюсь. И. Я не думаю что атм всё так сильно запущено :) тогда уж проще листом всю таблицу вытащить а потом гетнуть по индексу последнее значение. ))) Вадим, ну реально разницы нет между тем что ты сказал и то, что я описал только что.
...
Рейтинг: 0 / 0
Hibernate проекции
    #39252209
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
тут одинаково мыслим
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate проекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]