@tabe187 (Toru Abe)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SQLの文法エラー

Q&A

Closed

解決したいこと

以下を参考にしながら日記アプリを作成していますが、エラーが発生しページを表示することができません。

解決方法を教えて下さい。

発生している問題・エラー

2022-12-15T14:58:07.975+09:00 ERROR 75049 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [ SELECT d.id, d.category, d.title, d.content, TO_CHAR(d.date, 'YYYY/MM/DD') AS date, d.update_datetime, c.name FROM diary AS d INNER JOIN code AS c ON d.category = c.cd WHERE c.group_cd = '01']] with root cause

java.sql.SQLSyntaxErrorException: Table 'diary.code' doesn't exist

該当するソースコード

package diary.repository;
 
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;
 
import diary.entity.Diary;
import diary.form.diary.GetForm;
 
@Repository
public class DiaryDao implements IDiaryDao {
     
    private final NamedParameterJdbcTemplate jdbcTemplate;
 
    @Autowired
    public DiaryDao(NamedParameterJdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
 
    @Override
    public List<Diary> findList(GetForm form) {
        StringBuilder sqlBuilder = new StringBuilder();
        sqlBuilder.append(" SELECT d.id, d.category, d.title, d.content, TO_CHAR(d.date, 'YYYY/MM/DD') AS date, d.update_datetime, c.name"
                + " FROM diary AS d INNER JOIN code AS c ON d.category = c.cd"
                + " WHERE c.group_cd = '01'");
     
        // パラメータ設定用Map
        Map<String, String> param = new HashMap<>();
        // パラメータが存在した場合、where句にセット
        if(form.getCategory() != null && form.getCategory() != "") {
            sqlBuilder.append(" AND c.cd = :cd");
            param.put("cd", form.getCategory());
        }
        if(form.getDate() != null && form.getDate() != "") {
            sqlBuilder.append(" AND TO_CHAR(d.date, 'YYYY/MM') = :date");
            param.put("date", form.getDate());
        }
     
        String sql = sqlBuilder.toString();
     
        //タスク一覧をMapのListで取得
        List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, param);
        //return用の空のListを用意
        List<Diary> list = new ArrayList<Diary>();
     
        //データをDiaryにまとめる
        for(Map<String, Object> result : resultList) {
            Diary diary = new Diary();
            diary.setId((int)result.get("id"));
            diary.setCategory((String)result.get("category"));
            diary.setTitle((String)result.get("title"));
            diary.setContent((String)result.get("content"));
            diary.setDate((String)result.get("date"));
            diary.setUpdate_datetime((Timestamp)result.get("update_datetime"));
            diary.setName((String)result.get("name"));
            list.add(diary);
        }
        return list;
    }
}

テーブル

CREATE TABLE IF NOT EXISTS diary(
  id serial,
  category varchar(2),
  title varchar(50) NOT NULL,
  content text,
  date date NOT NULL,
  update_datetime timestamp,
  PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS category_code(
  id serial,
  group_cd varchar(2),
  cd varchar(2),
  name varchar(20),
  PRIMARY KEY(id)
);

CREATE TABLE IF NOT EXISTS users(
  id serial,
  user_id varchar(10) NOT NULL,
  password varchar(60) NOT NULL,
  username varchar(50),
  PRIMARY KEY(id)
);

エラー文を見るとsqlの文法エラーが原因であると思うのですが何が悪いのかわからず手詰まっております。

0 likes

2Answer

※同じ環境を用意して動作確認まではしていないので間違っていたらすみません

sqlBuilder.append(" SELECT d.id, d.category, d.title, d.content, TO_CHAR(d.date, 'YYYY/MM/DD') AS date, d.update_datetime, c.name"
                + " FROM diary AS d INNER JOIN code AS c ON d.category = c.cd"
                + " WHERE c.group_cd = '01'");

の部分をSQL分だけ抜き出してインデントを揃えて書くと以下のようになります。


SELECT
    d.id,
    d.category,
    d.title,
    d.content,
    TO_CHAR(d.date, 'YYYY/MM/DD') AS date,
    d.update_datetime,
    c.name
FROM
    diary AS d
INNER JOIN
    code AS c
 ON d.category = c.cd
WHERE
    c.group_cd = '01'

INNER JOINさせようとしているcodeというテーブル名が誤りでcategory_codeでは無いでしょうか?

2Like

@g-iki ご指摘いただいた通りでした。
新参者の未熟な質問に丁寧にご回答いただきありがとうございます。

0Like

Your answer might help someone💌