6月7日のエラー解決

springの解体新書の3章のデータベースから値を取得してみるでのエラー解決

に対しての気づき

 

エラー内容

f:id:tomato-program:20200611223442p:plain

2020-06-11 22:37:55.993 ERROR 37208 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECTemployee_id, employee_name, age FROM employee WHERE employee_id=?]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "SELECTEMPLOYEE_ID[*], EMPLOYEE_NAME, AGE FROM EMPLOYEE WHERE EMPLOYEE_ID=?"; 期待されるステートメント "SET, SAVEPOINT, SCRIPT, SHUTDOWN, SHOW"
Syntax error in SQL statement "SELECTEMPLOYEE_ID[*], EMPLOYEE_NAME, AGE FROM EMPLOYEE WHERE EMPLOYEE_ID=?"; expected "SET, SAVEPOINT, SCRIPT, SHUTDOWN, SHOW"; SQL statement:
SELECTemployee_id, employee_name, age FROM employee WHERE employee_id=? [42001-200]] with root cause
org.h2.jdbc.JdbcSQLSyntaxErrorException: SQLステートメントに文法エラーがあります "SELECTEMPLOYEE_ID[*], EMPLOYEE_NAME, AGE FROM EMPLOYEE WHERE EMPLOYEE_ID=?"; 期待されるステートメント "SET, SAVEPOINT, SCRIPT, SHUTDOWN, SHOW"
Syntax error in SQL statement "SELECTEMPLOYEE_ID[*], EMPLOYEE_NAME, AGE FROM EMPLOYEE WHERE EMPLOYEE_ID=?"; expected "SET, SAVEPOINT, SCRIPT, SHUTDOWN, SHOW"; SQL statement:
SELECTemployee_id, employee_name, age FROM employee WHERE employee_id=? [42001-200]

「7SQLステートメントに文法エラーがあります ”SELECTEMPLOYEE_ID

 

ここで、自分がしたことは

・スペルミス、空白ミスとかがないか確かめる

・エラー文をコピペしてgoogleで調べる

twitterで助けを求める(森さん大川氏ありがとうございやす)

 

これでも、なかなか解決できなくて

ここで、ようやくエラー文をちゃんと読んでみることに目を向けます

それでエラーの原因が分かりました

 

で、エラーの原因はエラー文に書いてある通り

SQLの文法エラーでして

String query = "SELECT"
   + "employee_id,"
   + "employee_name,"
   + "age"
   + "FROM employee"
   + "WHERE employee_id=?";

 

この文がエラーを生み出してました。(エラー文に書いてあります)

何がダメだったかというと

空白が無い事でした!

正しいのはこれ

String query = "SELECT"
   + "  employee_id,"
   + "  employee_name,"
   + "  age"
   + "  FROM employee"
   + "  WHERE employee_id=?";

 

正直、エラー文を読んでどこにエラーの原因もあるか分かっていて

SQLの文法になにかしらの間違いがあるんだろうなーとは

思っていたけど全然気づけずにすごい時間かかりました

 

で、なんで空白がないといけないのかと気づいたのかというと

一度ノートに、この間違っている文を文字列を連結して書いてみると

SELECTemployee_id,employee_name,ageFROM employeeWHERE employee_id=?

となりました(エラー文にまんま書いてありました)

これで

あ、SQLの学習しとるときSELECT文書くときに

SELECT文と指定列の間に空白いれてたわ!!

てな感じで、これにも空白入れないかんのかと思い

空白入れてみたらエラー解決できました!

 

で、なにに対して気づきがあったのかというと

一つは、エラー文をよく読むという事

エラー文が英語と日本語となんかいろいろとごっちゃになってて

あんまり読む気になれなかったけど、これを気に仲良くなれそうな気がします

 

 

で、2つ目は気づきというか前提知識をもってて良かったなと

spring解体新書する前にSQLを勉強していたので空白ないとアカンやん!てなったけど

この知識なかったらもっと時間かかってたのかなと

 

森さんから教えていただいたサンプルのコードを見て

空白のヒントをもらえたので、前提知識がなくともサンプルとかを見てエラーを解決することもできるだろうけど、きちんと理解した上での脳汁はえぐいですね

 

終わり