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

尝试学习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数据库中引发了一个错误

  • 问题内容: 嗨,我无法执行以下功能而没有遇到以下异常。我不确定为什么会这样。我认为这可能与报价有关。如果有问题,我正在使用derby数据库。 这是我尝试执行的以下代码: 这是例外: 问题答案: 您的代码中有两个问题: SQL语句最后不需要分号。它将使代码失败。 该代码易于进行SQL注入并且难以维护。请改用: 这应该是工作代码: 在 大 平原字符串连接而这种做法对于你的情况之间的区别就是参数会逃跑任