【问题标题】:Why does Hibernate cause a SQL syntax error despite having the correct dialect configured? [closed]尽管配置了正确的方言,为什么 Hibernate 会导致 SQL 语法错误? [关闭]
【发布时间】:2020-09-05 18:31:51
【问题描述】:

我被难住了。我正在建立一个新的 Spring Boot 项目。我创建了几个实体类。它能够在数据库中创建一半的表,所以我知道大部分是能够连接到数据库。我已经检查并在配置中设置了方言 - 我正在使用 org.hibernate.dialect.MySQLDialect。 当我尝试运行该问题时,我不断收到如下一组错误:

Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'integer, symbol varchar(5), primary key (id)) engine=InnoDB' at line 1

我尝试检查 google 和其他 stackoverflow 问题均无济于事。大多数情况下,我的发现引导我确保设置了正确的方言,并避免我检查过的保留关键字。

以下是显示的另外两个错误:

Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'integer, primary key (id)) type=MyISAM' at line 1
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varchar(255), clock_in varchar(255), clock_out varchar(255), coin varchar(255), ' at line 1

编辑: 这是hibernate正在生成的sql:

Hibernate: create table record (id integer not null, cash varchar(255), check varchar(255), clock_in varchar(255), clock_out varchar(255), coin varchar(255), primary key (id)) type=MyISAM
create table route (id integer not null, name varchar(100), color integer, driver varchar(255), index integer, primary key (id)) type=MyISAM
create table store (id integer not null, name varchar(100), address varchar(255), index integer, symbol varchar(255), primary key (id)) type=MyISAM

编辑 2 - 这是似乎在自动生成表时遇到问题的实体类之一:

package org.tampasa.kettles.models;

import javax.persistence.Entity;

@Entity
public class Store extends AbstractEntity{

    private String address;

    private String symbol;

    private int index;

    // Constructors

    public Store() {
    }


    // Getters and Setters

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public Integer getIndex() {
        return index;
    }

    public void setIndex(Integer index) {
        this.index = index;
    }

}

这里是 AbstractEntity:

package org.tampasa.kettles.models;

import org.hibernate.validator.constraints.Length;

import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotBlank;
import java.util.Objects;

@MappedSuperclass
public abstract class AbstractEntity {

    @Id
    @GeneratedValue
    private int id;

    @NotBlank(message = "Name must not be blank")
    @Length(min = 1, max = 100, message = "Name must be between 1 and 100 characters")
    private String name;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        AbstractEntity that = (AbstractEntity) o;
        return id == that.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

}

【问题讨论】:

  • 能否请您添加您的sql代码
  • 我如何找到它?我尝试将 spring.jpa.show-sql = true 添加到属性中,但在出现错误之前它没有显示任何内容。编辑:我想我找到了。见上文
  • 我相信你使用了实体类的自动表生成。你能列出一个你有麻烦的吗?我几乎从未使用过它,但我认为能够看到它会很棒。另外,请您检查一下,您使用的是适合该方言的正确 MySQL 版本吗?根据我的经验,可能会有一些奇怪的差异。至少,有一些带有 Postgres 和 Postgres95 的方言。 :)
  • 是的,没错,我正在使用实体类的自动表生成。我现在将编辑原始帖子以显示一个。
  • 一个可能的原因可能是未转义name 列。 MS 文档提到它是一个保留字:dev.mysql.com/doc/refman/8.0/en/…。我确定index 也不是合法名称。有一个属性强制 Hibernate 启用转义,我去找它。

标签: java mysql hibernate spring-data-jpa


【解决方案1】:

一个可能的原因是nameindex 列使用了SQL 保留字。至少在MySQL 8.0。通常也是如此。 我偶然发现了它too。 :D

根据this answer,您可以将行hibernate.globally_quoted_identifiers=true 添加到您的.properties 文件中。这应该使 Hibernate 转义保留字,也许可以解决您遇到的问题。

【讨论】:

  • 谢谢。索引和检查是导致问题的词。我可以通过更改班级中的变量名来修复它。属性设置对我不起作用。编辑:没关系,属性行确实有效。我还发现了另一个有用的属性,它自动引用被认为是关键字的单词:hibernate.auto_quote_keyword = true
  • @brendenm17 很高兴听到您解决了这个问题。另外,感谢分享额外的财产,我不知道。 :D
猜你喜欢
  • 2019-10-09
  • 2015-08-02
  • 2021-03-25
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2017-04-24
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多