원클릭으로
r2dbc-database-client-cud
Use DatabaseClient.fetch().rowsUpdated() for CUD on tables with composite keys — avoids R2DBC one() errors
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Use DatabaseClient.fetch().rowsUpdated() for CUD on tables with composite keys — avoids R2DBC one() errors
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Динамический LdapTemplate из БД + шифрование пароля + отключение авто-LDAP для безопасного старта без AD
Экспорт Excel с фильтром по датам — использование Thymeleaf inline для передачи дат из формы в JS
Полный цикл синхронизации справочника из Active Directory — сброс структуры, сохранение порядка, блокирующий код в WebFlux
Feature-флаг в БД (app_settings) с UI-тумблером на странице профиля
Парсинг Distinguished Name из Active Directory, извлечение OU-цепочки, правила маппинга на Department/Division и блокирующие вызовы в WebFlux
Разрешение конфликта Spring Data LDAP + R2DBC — strict mode, @Table на все entity, отключение LDAP-репозиториев
| name | r2dbc-database-client-cud |
| description | Use DatabaseClient.fetch().rowsUpdated() for CUD on tables with composite keys — avoids R2DBC one() errors |
| source | auto-skill |
| extracted_at | 2026-06-08T11:00:00.000Z |
When a Spring R2DBC @Table has a composite primary key (no single @Id field), never use @Query on the repository for Mono<> returning methods. R2DBC calls DefaultFetchSpec.one() internally, which throws IncorrectResultSizeDataAccessException: non unique result.
Use DatabaseClient (auto-configured by spring-boot-starter-data-r2dbc) and inject it:
private final DatabaseClient databaseClient;
// Spring injects automatically — no config needed
var spec = databaseClient.sql("UPDATE tbl SET col1 = :v1, col2 = :v2 WHERE id1 = :id1 AND id2 = :id2")
.bind("v1", dto.getVal1())
.bind("id1", id1)
.bind("id2", id2);
// Handle nulls explicitly — .bind() rejects null!
spec = dto.getVal2() != null ? spec.bind("v2", dto.getVal2()) : spec.bindNull("v2", String.class);
return spec.fetch().rowsUpdated().then(...);
return databaseClient.sql("DELETE FROM tbl WHERE id1 = :id1 AND id2 = :id2")
.bind("id1", id1).bind("id2", id2)
.fetch().rowsUpdated().then();
@Query("SELECT...") returning Mono<T> → one() crash@Query("UPDATE...") returning Mono<Void> → one() crash@Query("DELETE...") returning Mono<Integer> → one() crashrepository.save(entity) on tables without @Id → always INSERT, never UPDATEFlux<T> methods (no one())DatabaseClient.fetch().rowsUpdated() for CUD.filter().next() instead of @Query SELECT