powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / EasyQuery SQL генератор
16 сообщений из 16, страница 1 из 1
EasyQuery SQL генератор
    #39145283
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!
Я тут написал свой генератор sql запросов. Решил поделиться этим с сообществом.

Сам проект
https://github.com/tatagulov/eq

Описание и небольшая документация на wiki
https://github.com/tatagulov/eq/wiki

Здесь вы можете задавать свои вопросы и пожелания.
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39145298
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас уже есть jOOQ и QueryDSL. Зачем нам ещё один DSL?
Дизайн синтаксиса в таких DSL очень важная составляющая. Так как читать более менее сложные SQL запросы в виде Java кода очень тяжело.
У jOOQ очень клевый синтаксис, но есть ограничения в лицензировании.

Хотелось бы DSL на лямбдах. Тогда было бы что-то новое.
Некоторые IDE умеют валидировать SQL запросы. Так что это не самая основная проблема, которая решается такими DSL.
Их единственная польза это динамические запросы.
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39145312
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczХотелось бы DSL на лямбдах. Тогда было бы что-то новое.Нужно портировать Linq2Sql... и сделать что-то вроде StreamAPI2Sql (:
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39145338
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olzhas,

Глянул только PostgresSelect из описания
Код: java
1.
2.
3.
4.
String template = from!=null ?"select %s" : "values(%s)";
String selectSQL = String.format(template, (distinct ? "distinct " : "") + selectBuilder.toString());
...
StringBuilder sql = new StringBuilder(selectSQL + fromSQL + groupBySQL + havingSQL + orderBy + limitSQL + offsetSQL);
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39145340
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

У jOOQ в блоге очень много на эту тему
http://blog.jooq.org/tag/java-8/
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39145365
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Это про Linq Method Syntax, который можно сравнить с JPA Criteria. jOOQ замахивается на ORM (:
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146028
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczУ нас уже есть jOOQ и QueryDSL. Зачем нам ещё один DSL?
...


Я смотрел jOOQ, его возможностей мне было не достаточно поэтому я написал свой "велосипед". Для меня он лучше и удобнее, возможно кому то он тоже пригодиться.

0FDГлянул только PostgresSelect из описания
...

Вам не нравится такой стиль написания?
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146083
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olzhasЯ смотрел jOOQ, его возможностей мне было не достаточно поэтому я написал свой "велосипед". Для меня он лучше и удобнее, возможно кому то он тоже пригодиться.
Ну, если вы уж выставили свой байк на публику, то стоило бы указать чем именно он лучше и удобнее.
Я вижу только то что API на много меньше и код на SQL вообще не похож.
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146201
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olzhasВам не нравится такой стиль написания?
Да нет, просто String.format показался ну совсем не к месту, там где должна пара простых if-ов, вставляете ненужный и сложный String.format(ну хотя distinct был бы как параметр, кстати, а конструкция values(distinct ...) возможна?) и при достаточно большом количестве SB много +. Если если используете 8-ю версию, то там есть java.util.StringJoiner, который много упрощает:
Код: java
1.
2.
3.
4.
5.
6.
StringJoiner sjBy=new StringJoiner(","," group by ","").setEmptyValue("");
for (String sql : getGroupByExpressionSQLs(aliasGenerator)) {
	sjBy.add(sql);
}
...
StringBuilder sql = new StringBuilder(selectSQL)....append(sjBy.toString())...;
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146220
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDolzhasВам не нравится такой стиль написания?
Да нет, просто String.format показался ну совсем не к месту, там где должна пара простых if-ов, вставляете ненужный и сложный String.format(ну хотя distinct был бы как параметр, кстати, а конструкция values(distinct ...) возможна?) и при достаточно большом количестве SB много +. Если если используете 8-ю версию, то там есть java.util.StringJoiner, который много упрощает:
Код: java
1.
2.
3.
4.
5.
6.
StringJoiner sjBy=new StringJoiner(","," group by ","").setEmptyValue("");
for (String sql : getGroupByExpressionSQLs(aliasGenerator)) {
	sjBy.add(sql);
}
...
StringBuilder sql = new StringBuilder(selectSQL)....append(sjBy.toString())...;

конструкция
Код: java
1.
StringBuilder sql = new StringBuilder(selectSQL + fromSQL + groupBySQL + havingSQL + orderBy + limitSQL + offsetSQL);

тоже странная )
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146335
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Я использую эту библиотеку в реальном проекте, API расширяю по мере необходимости. Но даже сейчас реализовано много.

Да язык не поход на SQL, но это как раз его и отличие от других DSL.
SQL это структура, и в этой структуре много зависимости м\у его частями. Например что бы использовать поле из таблицы, вы должны его объявить в секции from или сделать join с условием. Другой пример использования агрегированных функций и секции group by. Добавил count, будь добр укажи другие поля в секции group by. Из-за чего вам сложно строить динамические запросы, хоть на нативном SQL хоть на jOOQ или же QueryDSL.

в моей библиотеке это делается просто.

Код: java
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
        Person person = new Person();
        // join будет только тогда, когда поле из этой таблице будет использовано в других секциях
        PersonMove innerPersonMove = person.person_id.innerPersonMove(); // здесь идет inner Join нужно для where
        PersonMove leftPersonMove = person.person_id.leftPersonMove();// здесь идет left Join нужно для select

        // фильтры
        if (filterCurrentData) innerPersonMove.where(innerPersonMove.move_date.eq(param(new Date(System.currentTimeMillis()))));
        if (fromDepId!=null) innerPersonMove.where(innerPersonMove.from_dep_id.eq(param(fromDepId)));
        if (personId!=null) person.where(person.person_id.eq(param(personId)));

        Select select = new PostgresSelect();
        select.select(person.first_name);
        select.select(person.last_name);
        // здесь идет inline join
        if (showPersonType) select.select(person.person_type_id.innerPersonType().person_type_name);

        // при чем можем соединять несколько раз, в итоге все равно будет только один Join
        if (showPersonType) select.select(person.person_type_id.innerPersonType().person_type_id);

        // считаем count, секция group by автоматически заполнится
        if (showCountMove) select.select(count(leftPersonMove.person_move_id).as("person_move_cnt"));

        // результаты для разных параметров
        ....
        boolean filterCurrentData = false;
        boolean showCountMove = false;
        boolean showPersonType = false;
        Short fromDepId = null;
        Integer personId = null;

        out >> select t0.first_name,t0.last_name from public.person t0

        ....
        boolean filterCurrentData = true;
        boolean showCountMove = false;
        boolean showPersonType = false;
        Short fromDepId = null;
        Integer personId = null;

        out >> select t0.first_name,t0.last_name 
                   from public.person t0 
                   inner join public.person_move t1 on t0.person_id = t1.person_id and t1.move_date = ?

        ....
        boolean filterCurrentData = true;
        boolean showCountMove = true;
        boolean showPersonType = false;
        Short fromDepId = null;
        Integer personId = null;

        out >> select t0.first_name,t0.last_name,count(t2.person_move_id) as person_move_cnt 
                  from public.person t0 
                      inner join public.person_move t1 on t0.person_id = t1.person_id and t1.move_date = ? 
                      left join public.person_move t2 on t0.person_id = t2.person_id 
                  group by t0.first_name,t0.last_name


        ....
        boolean filterCurrentData = true;
        boolean showCountMove = true;
        boolean showPersonType = true;
        Short fromDepId = null;
        Integer personId = null;

        out >> select t0.first_name,t0.last_name,t2.person_type_name,t2.person_type_id,count(t3.person_move_id) as person_move_cnt 
                  from public.person t0 
                  inner join public.person_move t1 on t0.person_id = t1.person_id and t1.move_date = ? 
                  inner join public.person_type t2 on t0.person_type_id = t2.person_type_id 
                  left join public.person_move t3 on t0.person_id = t3.person_id 
                  group by t0.first_name,t0.last_name,t2.person_type_name,t2.person_type_id


        ....
        boolean filterCurrentData = true;
        boolean showCountMove = true;
        boolean showPersonType = true;
        Short fromDepId = 123;
        Integer personId = 456;

        out >> select t0.first_name,t0.last_name,t2.person_type_name,t2.person_type_id,count(t3.person_move_id) as person_move_cnt 
                  from public.person t0 
                  inner join public.person_move t1 on t0.person_id = t1.person_id and t1.move_date = ? and t1.from_dep_id = ? 
                  inner join public.person_type t2 on t0.person_type_id = t2.person_type_id 
                  left join public.person_move t3 on t0.person_id = t3.person_id 
                  where t0.person_id = ? 
                  group by t0.first_name,t0.last_name,t2.person_type_name,t2.person_type_id
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146388
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olzhasв моей библиотеке это делается просто.
ты не делал сложных запросов с подзапросами
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146406
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Ну почему, вот боевой пример, более ранней версии.

Код: java
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.
30.
31.
32.
33.
34.
35.
36.
        final UColumn uColumn = new UColumn();
        final BrRecord brRecord;
        Integer searchBrId = brId != -1 ? brId : linkBrId;

        if (linkBrId!=-1 && brLinkTypeId!=-1) {
            final BrLinkTypeMap brLinkTypeMap = uColumn.U_COLUMN_CODE.innerBrLinkTypeMapByChildCode();
            brLinkTypeMap.where(brLinkTypeMap.BR_LINK_TYPE_ID, Criteria.EQ, brLinkTypeId);
            brLinkTypeMap.where(brLinkTypeMap.CHILD_DESC_LEVEL_ID, Criteria.EQ, descLevelId);
            brRecord = brLinkTypeMap.PARENT_CODE.innerUColumn().U_COLUMN_CODE.innerBrRecord();
        } else {
            brRecord = uColumn.U_COLUMN_CODE.innerBrRecord();
        }
        brRecord.where(brRecord.BR_ID, Criteria.EQ, searchBrId);

        class BrRecordData extends Select {
            public BrRecordData() { super(uColumn,true);}
            final ViewColumn<BrRecordData,String> U_FIELD_CODE = new ViewColumn<BrRecordData, String>(this,uColumn.U_FIELD_CODE);
            final ViewColumn<BrRecordData,Integer> FIELD_NUM = new ViewColumn<BrRecordData, Integer>(this,brRecord.FIELD_NUM);
        }

        final WorkList workList = new WorkList();
        workList.where(workList.DESC_LEVEL_ID, Criteria.EQ, descLevelId);
        workList.where(workList.DESC_TYPE_ID, Criteria.EQ, descTypeId);
        workList.where(fullView ? workList.IS_BR :workList.IS_PRIMARYBR , Criteria.EQ, (short) 1);

        final UField uField = workList.WORK_LIST_ID.innerWorkListColumn().U_COLUMN_CODE.innerUColumn().U_FIELD_CODE.innerUField();
        final BrRecordData brRecordData = uField.join(JoinType.left, uField.U_FIELD_CODE, new BrRecordData().U_FIELD_CODE);

        Select select = new Select(workList,true);

        select.select(uField.U_FIELD_CODE);
        select.select(uField.U_FIELD_NAME);
        select.select(uField.ISREPEATABLE);
        select.select(coalesce(brRecordData.FIELD_NUM,-1).as("FIELD_NUM"));

        SelectSQL sql = select.getSQL(new AliasGenerator());
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146428
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olzhasНу почему, вот боевой пример, более ранней версии.
ты ставь рядом исходный запрос.
Типа так для дерева:
Код: sql
1.
2.
3.
4.
5.
6.
select level, id, t.parent_id, lpad(' ', 3*level)||t.name as Tree, 
        SYS_CONNECT_BY_PATH(t.name, '/') as Path,
        t.* 
from table_tree t 
START WITH t.parent_id is null
CONNECT BY PRIOR id = t.parent_id
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146444
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olzhasНу почему, вот боевой пример, более ранней версии.

Какой ужас. Вы один на проекте? Коллеги пробовали такой код править?
...
Рейтинг: 0 / 0
EasyQuery SQL генератор
    #39146468
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
Сам SQL зависит от параметров
вот один из вариантов
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT DISTINCT
  t3.U_FIELD_CODE           AS U_FIELD_CODE,
  t3.U_FIELD_NAME           AS U_FIELD_NAME,
  t3.ISREPEATABLE           AS ISREPEATABLE,
  coalesce(t4.FIELD_NUM, ?) AS FIELD_NUM
FROM NABRK.WORK_LIST t0 
  INNER JOIN NABRK.WORK_LIST_COLUMN t1 
    INNER JOIN NABRK.U_COLUMN t2 
      INNER JOIN NABRK.U_FIELD t3 
        LEFT JOIN (SELECT DISTINCT
                    t5.U_FIELD_CODE AS U_FIELD_CODE,
                    t6.FIELD_NUM    AS FIELD_NUM
                  FROM
                    NABRK.U_COLUMN t5 INNER JOIN
                    NABRK.BR_RECORD t6 ON t5.U_COLUMN_CODE = t6.U_COLUMN_CODE AND t6.BR_ID = ?) t4
        ON t3.U_FIELD_CODE = t4.U_FIELD_CODE 
      ON t2.U_FIELD_CODE = t3.U_FIELD_CODE 
    ON t1.U_COLUMN_CODE = t2.U_COLUMN_CODE
  ON t0.WORK_LIST_ID = t1.WORK_LIST_ID
WHERE t0.DESC_LEVEL_ID = ? AND t0.DESC_TYPE_ID = ? AND t0.IS_BR = ?



Поддержки Оракла пока нет, да и с postgres не все реализовано. Поэтому всегда найдется пример, который я вам не смогу реализовать.


Blazkowicz,
Конечно я понимаю что этот код для новичка будет как китайская грамота. Но не все так страшно как выглядит на первый раз, это дело привычки.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / EasyQuery SQL генератор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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