当前位置: 首页 > 知识库问答 >
问题:

使用与MSSQLSERVER兼容的H2时,带有Data R2DBC findById()的Spring Boot 2.7.1失败(语法错误LIMIT 2)

丌官积厚
2023-03-14

我正在将 Spring Boot 2.6.9 应用程序升级到 2.7.x 行 (2.7.1)。应用程序测试使用 H2 和 MS SQL Server 兼容模式。

我创建了一个简单的示例项目来重现此问题:https://github.com/codependent/boot-h2

分支:

  • main:Spring Boot 2.7.1-测试KO
  • boot26:Spring Boot 2.6.9-测试正常

要检查行为,只需运行< code >。/mvnw干净测试

这些是代码的相关部分:

测试应用程序.yml

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

schema.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> {
}

调用< code > customer repository . find byid(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]

R2dbcEntity模板将选择一个查询限制为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的数据错误,或者有办法解决这个问题。

共有1个答案

解浩渺
2023-03-14

它将在Spring Data 2.4.3(2021.2.3)中解决

 类似资料:
  • 我试图用H2测试我的JPA原生@查询。我的原生查询如下: 在编写单元测试时,我得到以下H2错误: 原因:org.h2.jdbc.jdbcsqlexception:找不到表“accounts”;SQL语句:从'aws_account_name'喜欢LOWER(CONCAT(“%”,COALESCE(?,“”),“%”))限制的帐户中选择*?[42102-197] 我可以通过更改SQL语法将表名置于双

  • 问题内容: 我的“其他”有两个错误,我不知道该怎么办。他们被标记为评论!!导入了“ Punto”和“ Cuadrante”。还有一个枚举。 问题答案: 您可以使用if and else if实现您想要的 如果有的话,您可以拥有更多。 您当前的代码缺少一些右括号,这会导致您所拥有的错误,并且可以通过以下方式修复: 另一种/更好的方法是:

  • 扫描器输入=新扫描器(System.in); }

  • 使用spring我有这个endpoint, 带有日期字段的对象的Spring验证失败

  • 我有两个简单的Flink流式作业,从Kafka读取,做一些转换,并将结果放入Cassandra sink。他们从不同的Kafka主题阅读,并存入不同的卡桑德拉表。 当我单独运行这两个工作中的任何一个时,一切都很好。检查点被触发并完成,数据被保存到Cassandra。 我找不到关于这个错误的很多信息,它可能是由下列任何一个引起的: Flink(V1.10.0-Scala2.12), Flink Ca

  • 问题内容: 尝试拉出microsoft / nanoserver映像时遇到以下错误。下载成功。在提取图像期间会发生此错误。 482ab31872a2:下载失败,无法完成注册层:重新执行错误:退出状态1:输出: 在Win32中无法成功 打开 OpenForBackup :打开\?\ C:\ ProgramData \ Docker \ windowsfilter \ 07bd46b89b4520e9