簡體   English   中英

Spring 在使用具有 MSSQLSERVER 兼容性的 H2 時,使用數據 R2DBC findById() 引導 2.7.1 失敗(語法錯誤 LIMIT 2)

[英]Spring Boot 2.7.1 with Data R2DBC findById() fails when using H2 with MSSQLSERVER compatibility (bad grammar LIMIT 2)

我正在將 Spring Boot 2.6.9 應用程序升級到 2.7.x 行 (2.7.1)。 應用測試使用 H2 與 MS SQL 服務器兼容模式。

我創建了一個簡單的示例項目來重現此問題: https://github.com/codependent/boot-h2

分支機構:

  • 主要:Spring 引導 2.7.1 - 測試 KO
  • boot26:Spring 引導 2.6.9 - 測試正常

要檢查行為,只需運行./mvnw clean test

這些是代碼的相關部分:

測試應用程序.yml

spring:
  r2dbc:
    url: r2dbc:h2:mem:///testdb?options=MODE=MSSQLServer;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

架構.sql

CREATE SCHEMA IF NOT EXISTS [dbo];
CREATE TABLE IF NOT EXISTS [dbo].[CUSTOMER] (
    id INTEGER GENERATED BY DEFAULT AS IDENTITY,
    name VARCHAR(255) NOT NULL,
    CONSTRAINT PK__otp__D444C58FB26C6D28 PRIMARY KEY (id)
);

實體

@Table("[dbo].[CUSTOMER]")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CustomerEntity {

    @Id
    @Column("id")
    private Integer id;

    @Column("name")
    private String name;

}

數據 R2DBC 存儲庫

public interface CustomerRepository extends ReactiveCrudRepository<CustomerEntity, Integer> {
}

調用customerRepository.findById(xxx)時出現問題,如下測試所示

@SpringBootTest
@RequiredArgsConstructor
@TestConstructor(autowireMode = ALL)
class BootH2ApplicationTests {

    private final CustomerRepository customerRepository;

    @Test
    void shouldSaveAndLoadUsers() {

        CustomerEntity joe = customerRepository.save(new CustomerEntity(null, "Joe")).block();

        customerRepository.findById(joe.getId()).block();

例外:

Caused by: io.r2dbc.spi.R2dbcBadGrammarException: 
Syntax error in SQL statement "SELECT [dbo].[CUSTOMER].* FROM [dbo].[CUSTOMER] WHERE [dbo].[CUSTOMER].id = $1 [*]LIMIT 2"; SQL statement:
SELECT [dbo].[CUSTOMER].* FROM [dbo].[CUSTOMER] WHERE [dbo].[CUSTOMER].id = $1 LIMIT 2 [42000-214]

R2dbcEntityTemplate將 selectOne 查詢限制為 2 個元素:

    public <T> Mono<T> selectOne(Query query, Class<T> entityClass) throws DataAccessException {
        return (Mono)this.doSelect(query.getLimit() != -1 ? query : query.limit(2), entityClass, this.getTableName(entityClass), entityClass, RowsFetchSpec::one);
    }

這被翻譯成 H2/SQL Server 不支持的 LIMIT N 子句。

不確定它是某種 H2/Spring Data 錯誤還是有辦法解決這個問題。

在 Spring 數據 2.4.3 (2021.2.3) 中解決

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM