使用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
相关产品推荐
相关产品推荐

