powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно написать SQL запрос через CriteriaBuilder?
16 сообщений из 16, страница 1 из 1
Как правильно написать SQL запрос через CriteriaBuilder?
    #37890578
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такой запрос к БД в 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
Как правильно написать SQL запрос через CriteriaBuilder?
    #37890584
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вам крайне советую отказаться от критериев в таких запросах, hql или native sql рулит. Неужели вам самому не режет глаз этот убогий код? Критерии нужно для случаев вроде поиска, и желательно максимум на 1-2 сущность.
...
Рейтинг: 0 / 0
Как правильно написать SQL запрос через CriteriaBuilder?
    #37890589
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, код сейчас очень корявый, так как я упражнялся и пробовал разные варианты. Но я бы не сказал, что это режет глаз.
Хотелось бы сделать это именно через CriteriaBuilder, так как это более универсально, чем пихать NativeQuery.
...
Рейтинг: 0 / 0
Как правильно написать SQL запрос через CriteriaBuilder?
    #37890603
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЯ вам крайне советую отказаться от критериев в таких запросах, hql или native sql рулит.
В случае с NativeQuery.
А как потом распихать всё это по объектам? Ручками

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

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

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

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

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

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

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

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

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

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

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


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