spring boot 生成错误的sql代码

Posted

技术标签:

【中文标题】spring boot 生成错误的sql代码【英文标题】:Spring boot generates wrong sql code 【发布时间】:2018-07-07 21:41:09 【问题描述】:

我正在创建一个 POC,以便在我的下一个项目中使用 Spring Boot。 现在我创建了一个休息服务,它将从 MS sql 服务器数据库中查询所有数据。

我要查询的实体如下:

@Entity
@Table(name = "Item", schema = "materialManagement", uniqueConstraints = @UniqueConstraint(columnNames = 
        "companyID", "number" ))
public class Item implements java.io.Serializable 
//all variabels are placed here

现在,当我为 Item 类创建存储库时:

public interface NoteRepository extends JpaRepository<Item, Long> 

在我的控制器中,我自动装配 repo 并使用 findAll() 查询 repo:

@RestController
@RequestMapping("/api")
public class NoteController 
 @Autowired
    NoteRepository noteRepository;

    @GetMapping("/notes")
    public List<Item> getAllNotes() 
        return noteRepository.findAll();
    

现在,当我向控制器发送请求时,出现以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException:对象名称无效 'material_management.item'。

在数据库中确实没有 material_management 模式,只有 materialManagement。但是生成的模式是从哪里来的呢?

我的 application.properties 看起来像:

> spring.datasource.url =
> jdbc:sqlserver://localhost:1433;databaseName=CR_ApplicationSuite;integratedSecurity=true;
> 
> spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
> ## Hibernate Properties
> 
> # The SQL dialect makes Hibernate generate better SQL for the chosen database spring.jpa.properties.hibernate.dialect =
> org.hibernate.dialect.SQLServer2008Dialect

【问题讨论】:

你能发布你的 Hibernate 属性 Entity Class name is transformed into SQL table name with underscores的可能重复 【参考方案1】:

我在 application.properties 中添加了以下几行:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

【讨论】:

【参考方案2】:

Hibernate 命名策略将驼峰式大小写替换为 _

在你的情况下:

@Table(name = "Item", schema = "materialManagement", ...

变成

material_management

解决方案

要么删除所有小写的驼峰式大小写,要么如果必须是驼峰式,则必须更改 Hibernate 命名策略。

应用程序属性:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

【讨论】:

以上是关于spring boot 生成错误的sql代码的主要内容,如果未能解决你的问题,请参考以下文章

播种初始数据 - 使用 data.sql 的 Spring Boot

Spring Boot JPA data.sql 失败

Spring Boot API 错误地重复 SQL 数据

SQL 语句中的 Spring Boot Hibernate 语法错误

如何修复“java.sql.SQLException:找不到列 'id'。” Spring Boot 中的错误

在spring boot中捕获用户名和密码错误的SQL连接错误