【问题标题】:SQL error while running script with spring boot使用spring boot运行脚本时出现SQL错误
【发布时间】:2016-10-19 14:17:22
【问题描述】:

我正在尝试在我开始我的项目时填充我的数据库:

  1. 弹簧启动

  2. H2 嵌入式数据库

这是脚本:

INSERT INTO 'VET' VALUES (1, 'AAAA', 'BBBB');

这是我在 Java 中的实体:

@Entity
public class Vet extends BaseClass{

//  @Id
//  @GeneratedValue
//  private int id;
    @NotNull(message="{NotNull}")
    @Size(min=2,max=15,message="{Size}")
    @Column(name = "first_name")
    private String firstName;

    @NotNull(message="{NotNull}")
    @Size(min=2,max=15,message="{Size}")
    @Column(name = "last_name")
    private String lastName;

    ...
}

@MappedSuperclass
public class BaseClass {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

当我开始 Spring 时,这是 StackTrace:

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "INSERT INTO 'VET'[*] VALUES (1, 'AAAA', 'BBBB')"; expected "identifier"; SQL statement:
INSERT INTO 'VET' VALUES (1, 'AAAA', 'BBBB') [42001-192]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.message.DbException.getSyntaxError(DbException.java:205) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.command.Parser.readIdentifierWithSchema(Parser.java:3130) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.command.Parser.readTableOrView(Parser.java:5365) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.command.Parser.parseInsert(Parser.java:1053) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.command.Parser.parsePrepared(Parser.java:413) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.command.Parser.parse(Parser.java:317) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.command.Parser.parse(Parser.java:289) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.command.Parser.prepareCommand(Parser.java:254) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.engine.Session.prepareLocal(Session.java:560) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.engine.Session.prepareCommand(Session.java:501) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1202) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:170) ~[h2-1.4.192.jar:1.4.192]
    at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158) ~[h2-1.4.192.jar:1.4.192]
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:473) ~[spring-jdbc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
    ... 67 common frames omitted

当然,脚本的名称是data.sql,它位于资源文件夹中,显然是根据堆栈跟踪读取脚本。我不明白带标识符的部分

////编辑

好的,所以我尝试了这样的事情:

INSERT INTO VET('id', 'first_name', 'last_name') VALUES (1, 'AAAA', 'BBBB');

这就是错误

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "INSERT INTO VET('id'[*], 'first_name', 'last_name') VALUES (1, 'AAAA', 'BBBB')"; expected "identifier"; SQL statement:
INSERT INTO VET('id', 'first_name', 'last_name') VALUES (1, 'AAAA', 'BBBB') [42001-192]

但是当我去的时候:

INSERT INTO VET VALUES (1, 'AAAA', 'BBBB');

构建成功

所以仅出于教育目的,为什么第一个选项会出错?

【问题讨论】:

  • 'VET' 是一个字符串。它不是字段标识符。那就是 JUST VET,不带引号。
  • 您在VET 周围使用了单引号,而不是反引号
  • INSERT INTO VET(id, firstName, lastName) VALUES (1, 'AAAA', 'BBBB');
  • 标识符要么需要双引号 ",要么根本不需要引号(这是强烈推荐的)

标签: java sql spring spring-boot


【解决方案1】:

您的列名或表名不应该有引号。

INSERT INTO VET(id, first_name, last_name) VALUES (1, 'AAAA', 'BBBB')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2015-04-18
    • 2021-03-17
    • 2019-08-23
    • 2020-08-02
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多