本文介绍了SQL错误:1064,SQLState:42000,同时创建新的实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发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(可选= true)
@JoinColumn(name =districtid)
private DistrictModel districtModel;
}

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

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

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

@Column(name =name)
私有字符串名称;

@Column(name =desc)
私有字符串描述;

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

我使用以下Hibernate代码保存城镇:

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

但显示错误:

<$ p $警告[org.hibernate.engine.jdbc.spi.SqlExceptionHelper](http - 127.0.0.1-9090-1)SQL错误:1064,SQLState:42000
21:22:08,112错误[org.hibernate.engine.jdbc.spi.SqlExceptionHelper](http - 127.0.0.1-9090-1)您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行附近使用'desc,name'附近的正确语法值(2,'Test town desc。','Test town')')

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行
sun.reflect处使用接近'desc,name'值的正确语法(2,'Test town desc。','Test town')'' .NativeConstructorAccessorImpl.newInstance0(Native Method)〜[na:1.7.0_45]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)〜[na:1.7.0_45]
在sun。反射.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)〜[na:1.7.0_45]
在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]
在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个常用框架


解决方案



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



可能的解决方案:


  1. 将列的名称更改为描述。与 name 类似。

  2. 更改MySQL中的配置以支持查询中列的这些类型名称。 b $ b
  3. 更改字段中列的名称以追加`字符(引用自):

      @Column(name =`desc`)


IMO虽然选项3是一个快速和肮脏的解决方案,但我发现选项1作为将来使用数据库的最佳解决方案。


I am working on a Spring mvc web application in which I need to create a town using Hibernate. Following is my town model.

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

I have another entity named district. Town is a part of district and a district can have multiple towns. Following is my district model:

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

I am using following Hibernate code for saving town:

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

But it shows error:

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
解决方案

The error messages states:

The problem is in the generated query, due to the usage of desc since it's a reserved word in MySQL.

Possible solutions:

  1. Change the name of your column to description. Do similar with name.
  2. Change the configuration in MySQL to support these kind of names for columns in queries.
  3. Change the name of the column in the fields to append ` character (referenced from Creating field with reserved word name with JPA):

    @Column(name="`desc`")
    

IMO while option 3 is a quick and dirty solution, I find option 1 as the best solution for future usage of the database.

这篇关于SQL错误:1064,SQLState:42000,同时创建新的实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-10 21:50