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

使用WebFlux的Spring Boot中H2和R2DBC出现列未找到错误

濮阳安澜
2023-03-14

我使用WebFlux反应式模块、内存中的H2数据库和R2DBC反应式驱动程序创建了一个JavaSpringBoot服务。这在端口8081上构建并运行良好。

我添加了一个模式。main/resources下的sql文件,其中包含以下内容:

创建表内容项(内容项 ID INT 默认生成为身份主键,本地化名称 VARCHAR(100) 不为空);

我在同一目录中用 data.sql 文件填充表:

INSERT INTO contentitem (contentItemId, localizedName) VALUES (0, 'Zero');
INSERT INTO contentitem (contentItemId, localizedName) VALUES (1, 'One');
INSERT INTO contentitem (contentItemId, localizedName) VALUES (2, 'Two');

我的ContentItemhtml" target="_blank">模型是:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Table("contentitem")
public class ContentItem {
    @Id
    private Integer contentItemId;
    private String localizedName;

我的ContentItem计数器是:

@RestController
@RequestMapping("/contentItems")
public class ContentItemController {
    @Autowired
    private ContentItemService contentItemService;

    @GetMapping("/{contentItemId}")
    public Mono<ResponseEntity<ContentItem>> getContentItemByUserId(@PathVariable Integer contentItemId){
        Mono<ContentItem> contentItem = contentItemService.getContentItemById(contentItemId);
        return contentItem.map( u -> ResponseEntity.ok(u))
                .defaultIfEmpty(ResponseEntity.notFound().build());
    }

我的ContentItemService是:

@Service
@Slf4j
@Transactional
public class ContentItemService {

    @Autowired
    private ContentItemRepository contentItemRepository;

    public Mono<ContentItem> getContentItemById(Integer contentItemId){
        return contentItemRepository.findByContentItemId(contentItemId);
    }

}

我的ContentItemRepostory是:

public interface ContentItemRepository extends ReactiveCrudRepository<ContentItem,Integer> {
    Mono<ContentItem> findByContentItemId(Integer contentItemId);
}

当我用<code>调用正在运行的服务时http://localhost:8081/contentItems/1,我在get上收到一个500服务器错误,日志中有以下内容:

org.springframework.data.r2dbc.BadSqlGrammarException: executeMany; bad SQL grammar [SELECT contentitem.content_item_id, contentitem.localized_name FROM contentitem WHERE contentitem.content_item_id = $1]; nested exception is io.r2dbc.spi.R2dbcBadGrammarException: [42122] [42S22] Column "CONTENTITEM.CONTENT_ITEM_ID" not found; SQL statement:

几个问题:

  1. 为什么我的简单、明确、一致的列名(例如“contentItemId”)被修改为自己的下划线版本(例如“CONTENT_ITEM_ID”)?只是为了傻笑,我尝试在“contentItemId”数据成员上方添加“@Column(”content_item_id“)”注释,但得到了相同的结果。
  2. 为什么找不到“contentItemId”(或“CONTENT_ITEM_ID”)列?

使这一切复杂的是H2控制台,我在应用程序中启用了它。使用<code>spring.h2.console的属性文件。enabled=true失败,当我用调用它时出现404 Not Found错误http://localhost:8081/h2-控制台

共有1个答案

殳飞扬
2023-03-14

您需要在实体类中使用列批注

@Data
@AllArgsConstructor
@NoArgsConstructor
@Table("contentitem")
public class ContentItem {
    @Id
    @Column("contentItemId")
    private Integer contentItemId;
    @Column("localizedName")
    private String localizedName;
}

或者你应该用 _ 命名列

CREATE TABLE contentitem ( content_item_id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, localized_name VARCHAR(100) NOT NULL);
 类似资料:
  • 我的spring boot应用程序中的查询有问题。 我有一个由这个Pojo定义的表 我的CRUD存储库正在使用此表检索一组值 这是我的SQL查询,当我将其与MySQL一起使用并返回预期值时,它运行良好。不幸的是,当我将其用于我的应用程序/控制器时,我得到了一个与“id”字段相关的错误。 下面是错误堆栈 任何人都可以帮我弄明白为什么我会得到这个 2021-07-22 07:51:08.552WARN

  • 我使用WebFlux反应式模块、H2内存数据库和R2DBC反应式驱动程序创建了一个JavaSpring Boot服务。 当我运行该服务时,它失败并显示“无法创建连接工厂”错误: 这是一个嵌套的异常,似乎从存储库开始,然后通过服务传播回控制器。 在仔细阅读了生成的堆栈跟踪并没有发现任何问题的迹象后,我能找到的唯一线索是,我的类中的“连接工厂”输入参数(请参见下文)正在用红色曲线突出显示(“无法自动装

  • 你好,我试图学习野蝇和springboose一个非常简单的应用程序使用eclipse。项目名称是springboo-test。包括主方法类在内的所有类都在同一个包中。 主方法类称为'App',其代码如下: 以下是服务器日志: 11:36:57281信息[org.wildfly.extension.undertow](服务器服务线程池--68)WFLYUT0021:注册的web上下文:'/sprin

  • 得到错误"表客户已经存在"当我试图创建一个表在H2内存数据库使用schema.sql.我使用的是Spring启动版本:2.5.4和以下是我的pom.xml.它的工作正常,如果我使用Spring启动版本:2.4.3 这是我的代码: 当我启动应用程序时,我收到以下错误。如何强制H2使用schema.sql创建表格? 原因:io。r2dbc。spi。R2dbcBadGrammarException:表“

  • 我使用springboot和maryadb数据库进行训练。当我测试数据恢复时,我在邮递员中收到这样一条消息: 。我在复制粘贴中尝试了几个教程,我总是有相同的消息。我也会把控制台中的消息。提前谢谢你的帮助。 控制器 服务 回应的 模型 应用属性 安慰