LoginSignup
0
0

More than 3 years have passed since last update.

【Spring Data JPA + MySQL】ERROR 1064 (42000)を解消する

Last updated at Posted at 2020-12-02

エラーの内容

Spring Bootで、Spring Data JPAMySQL Driverを使った開発を行っていたところ
以下のようなエラーメッセージが表示されました。

java.sql.SQLSyntaxErrorException: 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…

SQL文に問題があるよって言われてるみたいだけど、JPA使ってるからSQL文なんて書いた覚えがない・・・

エラーが発生したソースコード

今回は、JPAのsaveメソッドを使って
MySQL側で用意したテーブルにinsertしようとしたら、上記のエラーが発生しました。

実装してエラーが発生したコードは以下の内容になります。

YAML

接続情報を定義しています。

application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/jpa_db?serverTimezone=JST
    username: qiita
    password: qiita
    driver-class-name: com.mysql.jdbc.Driver

Repostiory

org.springframework.data.jpa.repository.JpaRepositoryを継承したインタフェースを定義しています。

GroupRepository.java
package com.example.jpamysql.repository;

import com.example.jpamysql.domain.GroupEntity;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface GroupRepository extends JpaRepository<GroupEntity, Long> {

}

Service

String型で受け取った引数をEntityクラスのオブジェクトにセットして
JPAのsaveメソッドに渡しています。

GroupService.java
package com.example.jpamysql.service;

import com.example.jpamysql.domain.GroupEntity;
import com.example.jpamysql.repository.GroupRepository;

import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class GroupService {

    private final GroupRepository groupRepository;

    public void save(String name) {
        GroupEntity group = new GroupEntity();
        group.setName(name);

        groupRepository.save(group);
    }
}

Entity

テーブルの項目を定義したクラスです。今回はnameにだけinsertするので、descriptionはあらかじめMySQLの方でNULLを許容する設定にしています。

GroupEntity.java
package com.example.jpamysql.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
@Table(name = "groups")
public class GroupEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", columnDefinition = "VARCHAR(20)")
    private String name;

    @Column(name = "description", columnDefinition = "VARCHAR(45)")
    private String description;
}

解決策

application.ymlの設定を変えたり、MySQL側で作成したテーブルの設定を変えてみたりしましたが、今回のエラーには関係がありませんでした。

Entityのクラスで@Tableで定義しているテーブル名をバッククォーテーションで囲うと解決しました。

GroupEntity.java(修正後)
package com.example.jpamysql.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
@Table(name = "`groups`") //テーブル名をバッククォーテーションで囲う
public class GroupEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", columnDefinition = "VARCHAR(20)")
    private String name;

    @Column(name = "description", columnDefinition = "VARCHAR(45)")
    private String description;
}

MySQLではテーブル名をバッククォーテーションで囲ってあげなきゃいけないみたいですね。
(ずっとPostgreSQLを使っていたから知らなかった!!)

もしかしたらMySQLのバージョンにも寄るかもしれません。
私が使っていたのはMySQL Ver 8.0.2でした。

必ずしもテーブル名をバッククォーテーションで囲まなきゃいけない訳ではないのですが
今回のテーブル名である groups は、MySQL Ver 8.0.2以降では予約語に相当するので
バッククォーテーションで囲う必要があったようです。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0