繁体   English   中英

Java Persistence eclipselink mysql示例:SQL语法错误

[英]Java persistence eclipselink mysql example: error in sql syntax

我有一本简单的课本:

package it.mysql.beginner;

import java.util.Date;


import javax.persistence.*;

@Entity
@Table(name = "books")
public class Book implements java.io.Serializable {

private static final long serialVersionUID = 1L;

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

@Column(unique = true)
private String isbn;

private String author;
private String title;
private boolean read;

/*@OneToOne(cascade = CascadeType.PERSIST)
private Kind kind;*/

private String type;


@Temporal(TemporalType.DATE)
private Date riconsegna;

public String getIsbn() {
    return isbn;
}

public void setIsbn(String isbn) {
    this.isbn = isbn;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public boolean isRead() {
    return read;
}

public void setRead(boolean read) {
    this.read = read;
}

public Date getRiconsegna() {
    return riconsegna;
}

public void setRiconsegna(Date riconsegna) {
    this.riconsegna = riconsegna;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

/*public Kind getKind() {
    return kind;
}

public void setKind(Kind kind) {
    this.kind = kind;
}*/



}

这是Main类,我只是在其中尝试将书存储在mysql数据库中:

package it.mysql.beginner;

import javax.persistence.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Date;

public class Main {

public static void main(String argv[]) {

    EntityManagerFactory emf=Persistence.createEntityManagerFactory("mysqltest");

    EntityManager em = emf.createEntityManager();

        Date d = new Date();
    d.setMonth(11);
    d.setDate(25);
    d.setYear(1013);

    Book b1 = new Book();
    b1.setAuthor("Stephen King");
    b1.setIsbn("bg5dvc8");
    b1.setRead(true);
    b1.setRiconsegna(d);
    b1.setTitle("The green mile");
    b1.setType("Drammatico");

    em.getTransaction().begin();
    em.persist(b1);
    em.getTransaction().commit();

    em.close();
    emf.close();

}
}

persistence.xml文件设置正确,因为如果我尝试保存一些其他类(例如,用户),该文件将起作用...但是,这不适用于书籍。 这是我得到的例外:

[EL Info]: 2013-11-18 18:22:18.456--ServerSession(7486884)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b
[EL Info]: connection: 2013-11-18 18:22:18.714--ServerSession(7486884)--file:/home/lory/workspace/BeginnerMysql/build/classes/_mysqltest login successful
[EL Warning]: 2013-11-18 18:22:18.743--ServerSession(7486884)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: 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 'READ TINYINT(1) default 0, RICONSEGNA DATE, TITLE VARCHAR(255), TYPE VARCHAR(255' at line 1
Error Code: 1064
Call: CREATE TABLE books (ID INTEGER AUTO_INCREMENT NOT NULL, AUTHOR VARCHAR(255), ISBN VARCHAR(255) UNIQUE, READ TINYINT(1) default 0, RICONSEGNA DATE, TITLE VARCHAR(255), TYPE VARCHAR(255), PRIMARY KEY (ID))
Query: DataModifyQuery(sql="CREATE TABLE books (ID INTEGER AUTO_INCREMENT NOT NULL, AUTHOR VARCHAR(255), ISBN VARCHAR(255) UNIQUE, READ TINYINT(1) default 0, RICONSEGNA DATE, TITLE VARCHAR(255), TYPE VARCHAR(255), PRIMARY KEY (ID))")
[EL Warning]: 2013-11-18 18:22:18.804--UnitOfWork(27137311)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: 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 'READ, RICONSEGNA, TITLE, TYPE) VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25' at line 1
Error Code: 1064
Call: INSERT INTO books (AUTHOR, ISBN, READ, RICONSEGNA, TITLE, TYPE) VALUES (?, ?, ?, ?, ?, ?)
    bind => [6 parameters bound]
Query: InsertObjectQuery(it.mysql.beginner.Book@85a5a5)
Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: 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 'READ, RICONSEGNA, TITLE, TYPE) VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25' at line 1
Error Code: 1064
Call: INSERT INTO books (AUTHOR, ISBN, READ, RICONSEGNA, TITLE, TYPE) VALUES (?, ?, ?, ?, ?, ?)
    bind => [6 parameters bound]
Query: InsertObjectQuery(it.mysql.beginner.Book@85a5a5)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157)
    at it.mysql.beginner.Main.main(Main.java:60)
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: 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 'READ, RICONSEGNA, TITLE, TYPE) VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25' at line 1
Error Code: 1064
Call: INSERT INTO books (AUTHOR, ISBN, READ, RICONSEGNA, TITLE, TYPE) VALUES (?, ?, ?, ?, ?, ?)
    bind => [6 parameters bound]

但是我没有写任何sql ...为什么不起作用?

您可以使用以下方法来代替修改列名:

@Column(name = "`read`")
private boolean read;

您必须更改在实体类中read的字段的列名。

尝试这个:

@Column(name="isread")
private boolean read;

或直接在Java中更改它;或者

private boolean isRead;

不幸的是, READ是mysql中的保留字。

如果使用任何保留字来命名字段,则eclipseLink生成的SQL将具有无效的语法(错误代码:1064)。

http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

由于某种原因,我无法对此发表评论,所以很抱歉,如果这不是提前解决的问题,但是您似乎想在该行中添加值1

VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25'

MySQL不会在数据库中添加任何不带有“(引号)”的内容。 因此,尝试添加以下内容:

VALUES ('Stephen King', 'bg5dvc8', '1', '2913-12-25'

如您所见,我所做的只是在1周围加上一对引号,尝试添加该引号,看看它是否会改变任何内容。 MySQL的另一个很酷的部分是,如果您有权访问要添加的数据库,则可以手动将值放入数据库,然后查看代码以查看将其重新格式化为Java代码的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM