【问题标题】:SQL Error: 1064, SQLState: 42000 while creating new entitySQL 错误:1064,SQLState:42000 创建新实体时
【发布时间】:2015-05-10 21:05:00
【问题描述】:

我正在开发一个 Spring mvc Web 应用程序,我需要在其中使用 Hibernate 创建一个城镇。以下是我的城镇模型。

@Entity
@Table(name="town")
public class TownModel {

    @Id
    @Column(name="townid")
    @GeneratedValue 
    private Integer townId;

    @Column(name="name")
    private String townName;

    @Column(name="desc")
    private String townDesc;

    @ManyToOne(optional = true)
    @JoinColumn(name="districtid")
    private DistrictModel districtModel;
}

我有另一个名为区的实体。镇是区的一部分,一个区可以有多个镇。以下是我的地区模型:

@Entity
@Table(name="district")
public class DistrictModel {

    @Id
    @Column(name="districtid")
    @GeneratedValue
    private Integer districtId;

    @Column(name="name")
    private String name;

    @Column(name="desc")
    private String description;

    @OneToMany(mappedBy = "districtModel", fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<TownModel> townModelList;
}

我正在使用以下休眠代码来拯救城镇:

Session session = sessionFactory.getCurrentSession();
session.save(townModel);

但它显示错误:

21:22:08,104 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--127.0.0.1-9090-1) SQL Error: 1064, SQLState: 42000
21:22:08,112 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--127.0.0.1-9090-1) 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 'desc, name) values (2, 'Test town desc.', 'Test town')' at line 1

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'desc, name) values (2, 'Test town desc.', 'Test town')' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.7.0_45]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[na:1.7.0_45]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_45]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_45]
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.Util.getInstance(Util.java:360) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077) ~[com.mysql.jdbc_5.1.5.jar:na]
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062) ~[com.mysql.jdbc_5.1.5.jar:na]
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:493) ~[na:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:186) ~[hibernate-core-4.2.16.Final.jar:4.2.16.Final]
    ... 64 common frames omitted

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    desc 是 mysql 保留字。Check

    解决方案:

     @Column(name="[desc]")
                   ^    ^
    

    添加方括号 []。

    更改列名

    Source

    【讨论】:

      【解决方案2】:

      错误消息指出:

      您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 1 行的 'desc, name) 值(2, 'Test town desc.', 'Test town')' 附近使用

      问题出在生成的查询中,由于使用了desc,因为它是 MySQL 中的保留字。

      可能的解决方案:

      1. 将列名更改为description。对name 执行类似操作。
      2. 更改 MySQL 中的配置以支持查询中列的此类名称。
      3. 更改字段中的列名以附加`字符(引用自Creating field with reserved word name with JPA):

        @Column(name="`desc`")
        

      IMO 虽然选项 3 是一种快速而肮脏的解决方案,但我认为选项 1 是未来使用数据库的最佳解决方案。

      【讨论】:

      • 太棒了!我也有这个问题,对我来说,保留字是“索引”。很难调试那个。谢谢!
      • 在我的情况下,它是“或”作为别名)
      【解决方案3】:

      您也可以使用方括号或双引号来转义列名。

      @Column(name="[desc]")
      private String townDesc;
      

      @Column(name="\"desc\"")
      private String townDesc;
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,但我将其中一列命名为“订单”。当然,这也是一个保留字。容易犯错误。

        【讨论】:

        • 我遇到了同样的问题(名为“订单”的列)。是的,很容易犯错,花了一段时间才意识到!
        • 我也是。在我的情况下,保留字是“字符”,它是我的表的名称。所以这个名字的改变解决了这个问题。最烦人的事实是,我在测试中使用的 H2 数据库没有告诉我任何关于它的信息,我只遇到了真正的 MySQL 的问题。
        【解决方案5】:

        我在 MySQL Workbench 中添加了一个名为“order”的表,它没有给我一个错误。
        但是当我通过 Spring JPA 执行查询时 它给出了错误。
        那是因为我的表名 "order" 是保留字。
        只需稍作更改,错误就消失了。 change table name from "order" to "orders"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-26
          • 1970-01-01
          • 2017-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-22
          • 1970-01-01
          相关资源
          最近更新 更多