当前位置: 首页 > 知识库问答 >
问题:

尝试学习Hibernate,给出错误的sql语法错误

淳于星宇
2023-03-14

我正在练习JPA/Hibernate,在运行下面的代码时:

package com.newjpa;

import javax.persistence.*;

public class App 
{
    public static void main( String[] args ) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("book");
        EntityManager em = emf.createEntityManager();
        EntityTransaction et = em.getTransaction();
        et.begin();
        Book book = new Book();
        book.setAuthor("1423414");
        book.setTitle("#143441");
        book.setRating(4);
        book.setYear(2093);
        book.setDescr("13471863146486348626424372");
        em.merge(book);
        et.commit();
        em.close();
        emf.close();

    }
}

和Book类(没有getters和setters):

package com.newjpa;

import javax.persistence.*;

@Entity
@Table(name = "Books")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long bookId;
    private String author;
    private String title;
    private int year;
    private int rating;
    private String descr;


    public Book(String author, String title, int year, int rating, String descr) {
        this.author = author;
        this.title = title;
        this.year = year;
        this.rating = rating;
        this.descr = descr;
    }

    public Book() {
    }
}

我收到以下错误:

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 'value for hibernate_sequence' at line 1

我真的不知道这意味着什么以及如何解决它,我花了几个小时搜索,找不到类似的东西。persistence.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="book" transaction-type="RESOURCE_LOCAL">
 <provider>org.hibernate.jpa.HibernatePersistenceProvider
 </provider>
    <class>com.newjpa.Book</class>
    <properties>
        <property name="javax.persistence.jdbc.url  " 
 value="jdbc:mysql://www.remotemysql.com:3306/placeholder" />
        <property name="javax.persistence.jdbc.driver" 
 value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.user" 
 value="placeholder" />
        <property name="javax.persistence.jdbc.password" 
 value="placeholder" />

        <property name="hibernate.dialect" 
 value="org.hibernate.dialect.H2Dialect" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="create" />

    </properties>
</persistence-unit>

</persistence>

我在这里真的找不到任何错误——我在互联网上的许多地方看到了非常相似的代码。正如另一位用户所指出的,这是Hibernate生成的sql语句:创建表Books(book Id bigint not null,作者varchar(255),desr varchar(255),评级整数不为空,标题varchar(255),年份整数不为空,主键(book Id))值得指出的是,表是创建的,问题是异常,以及我创建的实体没有插入到表中的事实。重要更新:我发现Hibernate在这一行之前也生成了这一行:

Hibernate: create sequence hibernate_sequence start with 1 increment by 1

在创建表之后:

Hibernate: 
    call next value for hibernate_sequence

这似乎与问题有关

共有1个答案

王兴庆
2023-03-14

结果发现我有两个问题:我有错误的方言集(org . hibernate . dialect . H2 dialect而不是org . hibernate . dialect . MySQLDialect ),结果发现当使用MySQL 8时,您必须将方言从“MySQL dialect”更改为“MySQL8Dialect”。

 类似资料:
  • 尝试使用此查询 #1064-您的SQL语法有错误; 表和几乎完全相同-有相同的列。 请求中有什么错误?

  • 问题内容: 当我使用 我得到错误 错误1054:where子句中的未知列’U687678601’ 但是当我键入 它工作正常。 我正在使用mysql。 我知道这是一个新手问题,但是谁能解释为什么会这样,我可以通过编程方式添加引号吗?通过代码添加引号是个好主意吗? 谢谢 问题答案: 当我们向SQL查询提供字符串/ varchar类型时,必须使用’‘指定它。对于非varchar类型,则无需提供“。这就是

  • 问题内容: 在该问题中,我引用了以下代码: 我在该问题中发现,该结果按model.classes_给出的顺序表示了属于每个类的点的概率 所以…如果正确解释,此答案表示该点可能是“橙色”(由于数据量很少,因此置信度较低)。但是直觉上,这个结果显然是不正确的,因为给出的点与“苹果”的训练数据相同。可以肯定的是,我也进行了相反的测试: 同样,显然是不正确的,但方向相反。 最后,我尝试了更远的点。 同样,

  • 问题内容: 我从数据库中删除记录时遇到问题。几个小时以来,我一直在努力弄清自己在做错什么。我在这里搜索了一些主题,但没有一个回答我在做什么错。我在数据库中制作了这3个表: 这是我的hibernate映射文件: 因此,当我尝试从jTable中删除一条记录时,它给了我一个错误。这是我用来从jTable和数据库中删除数据的代码: ServiceCheck.java 这是错误: 任何帮助将不胜感激! 问题

  • 在下面的查询中,我使用了strftime函数来获取字符串格式的日期。它在sqlite数据库中运行良好。但是,当数据库更改为进程时,它抛出了一个错误,即“SQLSTATE[42883]:未定义函数:7错误:函数strftime(未知,没有时区的时间戳)不存在” 下面的代码在SQLite中工作,但在Postgres数据库中引发了一个错误

  • 我在家庭作业中使用Eclipse,我真的很挣扎。目标是编写一个工资单程序,让用户输入他们的姓名、工作时间、工资率、联邦和州预扣税,然后输出他们预扣金额的计算信息以及他们的净工资。 我使用了我熟悉的println语句来显示输出,但老师希望我们使用函数,我根本无法让它工作。如果我使用println语句,所有的值都会填充,但由于某种原因,我无法让printf执行相同的操作。我错过了什么?如果我使用pri