You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java EE7项目API调用报SQLGrammarException、H2表不存在问题求助

问题根因解释

1. 为什么用JPQL却出现Hibernate相关报错

JPQL是JPA规范定义的查询语言,本身只是一套接口标准,需要具体实现才能运行。你使用的Java EE 7应用服务器(比如WildFly、GlassFish、Payara等)默认内置了Hibernate作为JPA的官方实现,即使你没有主动在项目中引入Hibernate依赖,服务器运行时也会自动用内置的Hibernate来处理你的JPQL查询、做ORM映射,所以报错中出现Hibernate相关的异常类是正常现象,和你的代码选型不冲突。

2. 为什么没有配置H2却连接到H2数据库

你的persistence.xml配置存在不兼容问题,导致应用服务器没有读取到你写的MySQL连接配置,自动启用了服务器内置的默认数据源,绝大多数Java EE服务器的默认内置数据源就是H2内存数据库,所以才会出现H2相关的报错,在H2数据库里自然找不到你在MySQL中建的APARTMENTS表。
配置不兼容的核心问题在于:你开发的是Java EE 7项目,对应使用的是JPA 2.1规范,命名空间是http://xmlns.jcp.org/xml/ns/persistence,但你现在的persistence.xml用的是Jakarta Persistence 3.0的命名空间,Jakarta EE 9及以上版本才会识别这个命名空间,Java EE 7服务器根本识别不了这套配置,相当于你的数据库配置完全没生效。

修复步骤

  • 第一步:修正persistence.xml的命名空间和版本号,适配Java EE 7的JPA 2.1规范,修正后的配置示例如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">
    <persistence-unit name="rentRantPU" transaction-type="JTA">
        <class>com.rentRant.rentRant.model.Apartment</class>
        <class>com.rentRant.rentRant.model.User</class>
        <class>com.rentRant.rentRant.model.Review</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/rentRant?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="你的MySQL密码"/>
            <!-- 可选配置:打印生成的SQL,方便后续排查问题 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>
  • 第二步:确认你的项目中已经引入了MySQL JDBC驱动依赖,如果是Maven项目,在pom.xml中加入如下配置:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>
  • 第三步:确认你MySQL的rentRant库中已经创建了apartments表,表字段和你的Apartment实体类的属性映射一致。
  • 第四步:重新打包部署项目,再调用接口测试即可。

额外说明

你写的findAll方法的JPQL语法没有问题,不需要修改。

内容的提问来源于stack exchange,提问作者user16176270

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:54:04