Вступление
В первой части мы научили команду разработчиков пяти Fetch. По запросу ветерана кровавых энтерпрайз-войн из первой части (тот, который разбился на spring-паровозике), мы продолжим двумя короткими но важными темами: получение сгенерированных колонок и количества обновленных строк.
Сгенерированные колонки
В классической бэкенд-разработке часто встречается следующая задача: нужно вставить новую строку в таблицу и забрать её id. Иногда подобную возможность базы данных предоставляют на уровне sql-синтаксиса: returning
в PG, Oracle, MariaDB и output
в SQL Server. JDBC предлагает переносимое решение – метод .getGeneratedKeys()
, который реализует эту функциональность. Разумеется, она доступна и в TrueSql:
var id = ds.q(
"insert into users values(default, ?, ?)",
"Boris", "pro drinker"
).asGeneratedKeys("id").fetchOne(long.class);
Конечно же, .asGeneratedKeys(String cols ...)
работает и с .g
.
var billDiscount = ds.q("""
update bill
set discount = amount * ?
where type = ?""", new BigDecimal("0.2"), 3
)
.asGeneratedKeys("id", "discount")
.g.fetchList(Discount.class);
Здесь мы сделали скидку на все чеки с типом 3
, вернули id чека и размер скидки. Получение сгенерированных колонок в TrueSql делается очень просто и, что важно, без ограничений сочетается с остальными возможностями TrueSql.
Количество обновленных строк
Иногда бывает удобно/необходимо узнать сколько строк обновил наш SQL-запрос. В JDBC для этого предусмотрен .getUpdateCount()
, а у нас .withUpdateCount
:
var updateCount = ds.q(
"update bill set discount = ? where bill.date = ?",
new BigDecimal("0.2"), LocalDate.of(2025, 3, 13)
).withUpdateCount.fetchNone();
В данном примере мы вернули только количество обновленных строк, переменная updateCount
будет иметь тип long
. В примере ниже рассмотрим сочетание .withUpdateCount
с .asGeneratedKeys()
.
var updatedBills = ds.q(
"update bill set discount = amount * ?", new BigDecimal("0.2")
)
.asGeneratedKeys("id", "discount")
.withUpdateCount
.g.fetchList(Discount.class);
Переменная updatedBills
будет иметь следующую структуру: UpdateResult{Long updateCount, List<Discount> value}
. Таким образом, TrueSql продолжает демонстрировать чудеса композиции.
Как правило, самый простой подход оказывается самым эффективным
TrueSql даёт удобный comptime-safe API к возможностям JDBC. Количество кода минимально, он прозрачен. Писать на TrueSql после Spring Data это как есть супчик ложкой, а не вилкой. В следующих сериях мы продолжим борьбу за здравый смысл!
Сайт проекта: https://truej.net/
Наш TG-канал. Тут вы можете задавать свои вопросы, находить ответы.
Документация. Всем, кто уже настрадался с паровозиком Spring Data и его друзьями, предлагаю поставить звездочку. Может это спасет вас от кривой Фреди-Крюгера.
В следующих частях:
Транзакции и работа с соединениями
Хранимые процедуры
unfold-параметры
Батчинг
Композиция TrueSql DSL
Ча-Ча-Ча с базой данных – advanced fetching
