Комментарии 27
Никогда не понимал таких "фишек". Ейбогу, гораздо проще зайди в базу и написать и оттестить запрос на чистом SQL.
Я не против этого решения :)
Каждый работает так, как считает эффективным. Если кто-то всю сознательную жизнь работал на чистом SQL, то он и продолжит на нем работать. Новичку же, вероятно будет проще с текущим вариантом.
Хотя ему так и так придется изучать теорию и нормальные формы, чтобы уметь эффективно проектировать базы.
Обычно либо хватает простого SQL, либо, если уж хочется статической проверки, то полноценно подключается тот же упомянутый JOOQ. А тут довольно странный промежуточный шаг. Впрочем, на вкус и цвет...
Сгенерирует простейший:
SELECT * FROM `table1`
есть подозрение, что эта штука поддерживает только mysql.
"name %i"
где name VARCHAR(80)
new SelectBuilder()
.column("name")
.column("age")
.from("Employee")
.where("dept = 'engineering'")
.where("salary > 100000")
.toString();
Получается
select name, age from Employee where dept = 'engineering' and salary > 100000
А как там будет выглядеть:
select e.name, e.surname, b.summ from employe e, bills b where b.employeid=e.id and ((e.age>51 and b.type=2) or b.type=1);
Выбрать ФИО+суммы для всех, кто старше 51 года и получал платежи типа 2 или всех кто получил платеж типа 1.
new SelectBuilder()
.column("e.name")
.column("e.surname")
.column("b.summ")
.from("employe e, bills b")
.where("b.employeid=e.id and ((e.age>51 and b.type=2) or b.type=1)")
.toString();
Прелесть в том что можно строить запрос динамически, вот тут автор показывает как:
.where("dept = 'engineering'")
.where("salary > 100000")
Если я правильно понял, то в случае когда значение для dept или salary приходит от пользователя, то его нужно фильтровать вручную, иначе тут будет присутствовать SQL-инъекция.
В моем случае запись бы имела следующий вид:
.where("dept %s", IQL.EQUAL, "engineering")
.where("salary %i", IQL.MORE, 10000)
что привело бы к экранированию escape-последовательностей, а сигнатуры типов (%s и %i) здесь нужны именно для этого
Порядок команд не имеет значения, например GROUP BY можно указать после LIMIT, WHERE после ORDER BY, а JOIN перед SELECT
по мне так это скорее минус чем плюс, в лучшем случае у вас получится йода стайл, в худшем будете искать где же кто поставил этот лимит.
Подстветка синтаксиса при использовании IDE (чего, обычно, лишена прямая запись SQL-запросов)
если говорить о идее то в ней есть подсветка синтаксиса для SQL запросов, а если подключить еще и базу через настройки идея проверит и наличие таблиц и полей.
В целом jooq очень хорош и по мне разобраться с ним не так сложно.
INSERT INTO NameYourTableResult (
Field1,
Field2,
Field3
...
FieldN
)
WITH --в этот блок помещаются временные таблицы, которые и заменяют View
TempTable1 as (
--Сложный SQL запрос, результат которого будет храниться в TempTable1 на протяжении всего INSERT INTO
)
TempTable2 as (
--Сложный SQL запрос, в котором мы можем использовать временную таблицу TempTable1 и другие таблицы базы данных
)
TempTable3 as (
--Сложный SQL запрос, в котором мы можем использовать временные таблицы TempTable1, TempTable2 и другие таблицы базы данных
)
--... и так далее, но главное не увлекаться :)
--Основной блок SELECT, из которого результаты пойдут в команду INSERT INTO (количество полей в SELECT равно количеству полей в INSERT)
--В этом запросе SELECT используются временные таблицы TempTable1, TempTable2, TempTable3 и т.д. и другие источники данных
SELECT --Перечень полей
FROM TempTable3, sourceTable1, sourceTable2, sourceTable3
JOIN ...
WHERE ...;
IQL — очередной SQL-генератор для Java