Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно написать SQL запрос через CriteriaBuilder? / 16 сообщений из 16, страница 1 из 1
24.07.2012, 14:37:24
    #37890578
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Есть такой запрос к БД в SQL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * from
schet
left join error schet_error on schet.id_pak=schet_error.id_pak and schet_error.id_sluch is null and schet_error.id_usl is null
left join sluch on sluch.id_pak=schet.id_pak
left join error sluch_error on sluch.id_pak=sluch_error.id_pak and sluch.id_sluch=sluch_error.id_sluch and sluch_error.id_usl is null
left join usl on usl.id_sluch=sluch.id_sluch and usl.id_pak=sluch.id_pak
left join error usl_error on usl.id_pak=usl_error.id_pak and usl.id_sluch=usl_error.id_sluch and usl.id_usl=usl_error.id_usl
left join intox on intox.id_pak=usl.id_pak and intox.id_sluch=usl.id_sluch and intox.id_usl=usl.id_usl
left join expert on expert.id_pak=usl.id_pak and expert.id_sluch=usl.id_sluch and expert.id_usl=usl.id_usl
--where [всякие условия]
order by schet.id_pak,sluch.id_pak,sluch.id_sluch,usl.id_pak,usl.id_sluch,usl.id_usl,intox.id_pak,intox.id_sluch,intox.id_usl,expert.id_pak,expert.id_sluch,expert.id_usl


Можно конечно createNativeQuery и сунуть туда всё это, а потом ручками отобразить на объекты, но это как-то некрасиво.

Как бы его переписать через CriteriaBuilder?

Код: sql
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.
        try {
            Class classname = Schet.class;
            CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
            CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();

            Root<Schet> schet = criteriaQuery.from(Schet.class);
            Root<Sluch> sluch = criteriaQuery.from(Sluch.class);
            Root<Usl> usl = criteriaQuery.from(Usl.class);



            //CriteriaQuery<Object> select = criteriaQuery.multiselect(schet, sluch, usl);
            List sel=new ArrayList();
            sel.add(schet);
            sel.add(sluch);
            sel.add(usl);
            CriteriaQuery<Object> select = criteriaQuery.select(schet.join("sluchList", JoinType.LEFT).join("uslList", JoinType.LEFT)).distinct(true);


            TypedQuery<Object> typedQuery = em.createQuery(select);
            Object some_ret = typedQuery.getResultList();

            String gg = "";


        } catch (Exception e) {
            String er = e.getMessage();
            String gh = "";
        }



В результате criteriaQuery.select(schet.join("sluchList", JoinType.LEFT).join("uslList", JoinType.LEFT)).distinct(true); получается список cущностей usl.

Хочется выполнить этот запрос и чтоб результаты пораспихались по объектам. Но не получается сделать это 1-им запросом.
Если я буду обращаться к связанным сущностям полученной сущности, то будут доставаться все связанные сущности, так как будут генерироваться запросы вида:
Код: sql
1.
select поля сущности from таблица where (id=?)


Или выполнять 1 и тот же запрос для каждой сущности, а потом их как-то ручками соединять друг с другом? Но связанных сущностей у меня 13. 13 раз выполнять этот запрос с join'ми?

Суть проблемы в том, что если использовать criteriaQuery.multiselect(schet, sluch, usl); то на выходе получается какой-то идиотский запрос типа:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t0.[поля],t2.[поля],t1.[поля]
FROM MEDFIN.SCHET t0
LEFT OUTER JOIN MEDFIN.SLUCH t4 ON (t4.ID_PAK = t0.ID_PAK)
LEFT OUTER JOIN MEDFIN.USL t3 ON ((t3.ID_PAK = t4.ID_PAK) AND (t3.ID_SLUCH = t4.ID_SLUCH))
,
USL t2, SLUCH t1 WHERE (t3.SKIND = '5')


Недостаток этого запроса в том, что если хотя бы 1 таблица пустая, то весь запрос вернёт пустой результат. Следовательно:
Мне не надо чтобы у меня генерировался запрос с перечислением таблиц в секции from через запитую.

Подскажите как лучше поступить.
...
Рейтинг: 0 / 0
24.07.2012, 14:39:45
    #37890584
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Я вам крайне советую отказаться от критериев в таких запросах, hql или native sql рулит. Неужели вам самому не режет глаз этот убогий код? Критерии нужно для случаев вроде поиска, и желательно максимум на 1-2 сущность.
...
Рейтинг: 0 / 0
24.07.2012, 14:42:11
    #37890589
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Ну, код сейчас очень корявый, так как я упражнялся и пробовал разные варианты. Но я бы не сказал, что это режет глаз.
Хотелось бы сделать это именно через CriteriaBuilder, так как это более универсально, чем пихать NativeQuery.
...
Рейтинг: 0 / 0
24.07.2012, 14:48:18
    #37890603
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
авторЯ вам крайне советую отказаться от критериев в таких запросах, hql или native sql рулит.
В случае с NativeQuery.
А как потом распихать всё это по объектам? Ручками

Если говорить про EJBQL, то можно ли этот запрос переписать в EJBQL примерно так:
SELECT Schet,Sluch,Usl,Error,Intox,Expert From Schet JOIN Sluch JOIN Usl .... WHERE .... ORDER BY ...
То есть так, чтоб всё в объёкты попало.
...
Рейтинг: 0 / 0
24.07.2012, 14:50:24
    #37890608
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Ну чем это более универсально? Запрос будет выполняться на sql, вводя критерии вы вводите дополнительный слой абстракции, куча кода по преобразованию оттуда-сюда и обратно, к тому же при дебаге гораздо проще взять sql - запустить и посмотреть что выдало а с критериями че?
Дело конечно ваше, но по опыту - это лишняя работа, хотя может быть полезно для опыта)
...
Рейтинг: 0 / 0
24.07.2012, 14:50:29
    #37890609
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Niky4000А как потом распихать всё это по объектам? Ручками

Вроде, если алиасы задать нормально и указать хиберу, то он справиться.
...
Рейтинг: 0 / 0
24.07.2012, 14:51:10
    #37890614
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
про Transformer слышали?
...
Рейтинг: 0 / 0
24.07.2012, 14:54:08
    #37890619
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
забыл никпро Transformer слышали?
В JPA ?
...
Рейтинг: 0 / 0
24.07.2012, 14:54:31
    #37890622
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Не слышали.
...
Рейтинг: 0 / 0
24.07.2012, 14:56:42
    #37890629
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Niky4000Не слышали.
Hibernate рулит.
...
Рейтинг: 0 / 0
24.07.2012, 14:56:55
    #37890631
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Blazkowiczзабыл никпро Transformer слышали?
В JPA ?
С JPA давно не работал, что там нету такого? Я писал основываясь на Hibernate. Ну тогда hql и aliasы
...
Рейтинг: 0 / 0
24.07.2012, 14:58:19
    #37890639
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
авторНу чем это более универсально? Запрос будет выполняться на sql, вводя критерии вы вводите дополнительный слой абстракции, куча кода по преобразованию оттуда-сюда и обратно, к тому же при дебаге гораздо проще взять sql - запустить и посмотреть что выдало а с критериями че?
Подключили другую СУБД и ничего не изменилось - вот в чём универсальность.
А с критериями включили логирование и посмотрели что за запрос сервер сгенерировал.
А как я узнал что он дурь генерирует?
...
Рейтинг: 0 / 0
24.07.2012, 15:03:12
    #37890653
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Niky4000Подключили другую СУБД и ничего не изменилось - вот в чём универсальность.

Это глупость.
Во-первых смена СУБД требует полноценного тестирования, не зависимо от того ORM вы используете или SQL.
Во-вторых это необходимость такой смены на длинном проекте возникает не чаще чем раз в год-два. Так что эта "универсальность" ради "универсальности" ещё никого не спасла.

Niky4000А с критериями включили логирование и посмотрели что за запрос сервер сгенерировал.

А нативный SQL запрос по какой магической причине логироваться не будет? Или в чем проблема?

Niky4000А как я узнал что он дурь генерирует?
И как это влияет на правильный выбор решения?
...
Рейтинг: 0 / 0
24.07.2012, 15:04:56
    #37890659
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Niky4000Подключили другую СУБД и ничего не изменилось - вот в чём универсальность.

:) Ну ладно, я вам свое мнение сказал. Правда я за 7 лет на java такого еще не видел, чтобы поменяли СУБД, а если даже бы и поменяли - там геморра другого было бы куча по сравнению с парой запросов). По большому счету это маркетинговый миф, базу можно поменять максимум в самом начале, после выхода в продакшен - ну это кхм..маловероятно.

Niky4000А с критериями включили логирование и посмотрели что за запрос сервер сгенерировал.

Вот именно - лезть на сервер, смотреть логи, а не проще в код глянуть?

Опять же я ни на чем не настаиваю, просто пытаюсь не дать наступить вам на грабли, там где сам шишку набил.
...
Рейтинг: 0 / 0
24.07.2012, 15:05:24
    #37890660
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Niky4000Подключили другую СУБД и ничего не изменилось - вот в чём универсальность.

И вообще забудьте слово "универсальный". Им обычно начинающие разработчики прикрывают своё субъективное мнение. Существуют разные более объективные критерии, чем "универсальная" программа.
...
Рейтинг: 0 / 0
24.07.2012, 15:26:20
    #37890732
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно написать SQL запрос через CriteriaBuilder?
Наверное, лучше через EJB-QL написать этот запрос.
Только мне бы ещё надо некоторые поля расшифровать через справочники - типа подзапросов написать ещё.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно написать SQL запрос через CriteriaBuilder? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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