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

使用Play Framework+JPA/Ebean查询MySQL数据库时遇SQL语法错误

搞定这个SQL语法错误很简单!

嘿,看你的错误日志,核心问题一目了然:你把MySQL的保留关键字default用作表名了,JPA生成SQL的时候没给这个关键字加转义,直接就报错了。

快速修复方案

直接修改实体类的@Table注解,给表名加上反引号,和你处理列名的方式保持一致,让JPA知道这是个需要转义的标识符:

package models;

import javax.persistence.*;

@Entity
@Table(name="`default`") // 给表名加上反引号
public class Language {
    @Id
    @Column(name="`id`")
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long id;
    
    @Column(name="`text`")
    public String text;
    
    @Column(name="`help`")
    public String help;
}

更稳妥的长期方案

其实更推荐你直接修改数据库表名,别用default这种MySQL保留关键字。毕竟以后开发里,要是再不小心用到其他关键字,还会踩同样的坑,换个比如language_default或者app_default这种非关键字的名字,一劳永逸。

为啥会报错?

MySQL有一堆自带的保留关键字(像default、select、where这些都是),如果要把它们当表名/列名用,必须用反引号()包起来才行。你之前的@Table(name="default")没加反引号,JPA生成的SQL就直接写了from default language0_`,MySQL一看这语法就懵了,直接给你抛语法错误。

改完之后再运行你的查询代码:

private Stream<Language> list(EntityManager em) {
    List<Language> persons = em.createQuery("select p from Language p").getResultList();
    return persons.stream();
}

这时候JPA会生成带反引号的SQL:select ... from default language0_ ...,MySQL就能正确识别这个表名啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:07:20