Образец стека: Spring Data R2db c 1.0.0.RELEASE, R2db c Ms sql 0,8, полный код здесь .
Сценарий инициализации :
use tempdb;
IF OBJECT_ID(N'dbo.posts', N'U') IS NULL
BEGIN
CREATE TABLE posts (
id BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
title VARCHAR (50) NOT NULL,
content VARCHAR (50) NOT NULL,
createdAt DATETIME,
updatedAt DATETIME
)
END;
При сохранении данных и получении сгенерированных ключей из DataInitializer
.
@Component
@Slf4j
class DataInitializer {
private final DatabaseClient databaseClient;
public DataInitializer(DatabaseClient databaseClient) {
this.databaseClient = databaseClient;
}
@EventListener(value = ContextRefreshedEvent.class)
public void init() {
log.info("start data initialization...");
this.databaseClient.delete().from("posts")
.then().
and(
this.databaseClient.insert()
.into("posts")
//.nullValue("id", Integer.class)
.value("title", "First post title")
.value("content", "Content of my first post")
.map((r, m) -> r.get( 0, BigDecimal.class)).all()
.log()
)
.thenMany(
this.databaseClient.select()
.from("posts")
.orderBy(Sort.by(desc("id")))
.as(Post.class)
.fetch()
.all()
.log()
)
.subscribe(null, null, () -> log.info("initialization is done..."));
}
}
Если я использую Integer
или Long
вместо BigDecimal
в строка .map((r, m) -> r.get( 0, BigDecimal.class)).all()
, это вызовет ошибку, указывает Невозможно декодировать значение типа [java .lang.Long], имя [GENERATED_KEYS] тип сервера [числовой] , это не bigint
, как определено в скрипте схемы я должен использовать BigDecimal
, чтобы он работал.