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



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

我在main/resources下添加了一个schema.sql文件,其中包含以下内容:

CREATE TABLE contentitem ( contentItemId INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, localizedName VARCHAR(100) NOT NULL);

我在同一目录中用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');

我的ContentItem模型是:

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

我的ContentItemController是:

@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);
}
}

我的ContentItemRepository是:

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

当我用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"(列

使这一切更加复杂的是,我在application.properties文件中用spring.h2.console.enabled=true启用的H2控制台在用http://localhost:8081/h2-console调用它时失败,并出现404 Not Found错误。

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

@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);

相关内容

  • 没有找到相关文章

最新更新