[Spring/SpringBoot] MySql SQL Error: 1064, SQLState: 42000 에러 해결하기
SQL Error: 1064, SQLState: 42000
에러가 나는 원인은 다양하지만 MySql 예약어를 사용해서 오류가 난 경우가 아닌 다른 경우입니다.
2024-06-09T12:36:16.529+09:00 WARN 5671 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1064, SQLState: 42000
2024-06-09T12:36:16.529+09:00 ERROR 5671 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : 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 '0)' at line 1
2024-06-09T12:36:16.530+09:00 INFO 5671 --- [nio-8080-exec-1] p6spy : #1717904176530 | took 0ms | rollback | connection 1|
오류를 보면 syntax 에러가 났고 0) 이 부분에서 오류가 낫다고하네요
select r1_0.book_id, r1_0.id, r1_0.content, r1_0.created_at, r1_0.deleted_at, r1_0.is_deleted, r1_0.score, r1_0.updated_at, r1_0.user_id
from review r1_0
where r1_0.book_id=? and (r1_0.is_deleted is 0)
이 부분에서 오류가 난 것입니다.
원인
하이버네이트는 boolean 타입으로 table을 만들때 tinyint값으로 칼럼을 만듭니다.
따라서
public boolean isDeleted() {
return this.isDeleted;
}
이런식으로 작성된 엔티티는 ddl auto = create를 사용했을때
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| is_deleted | tinyint(1) | NO | | 0 | |
이렇게 칼럼이 만들어진 것을 확인할 수 있습니다.
이때
한편 오류가 난 sql 쿼리문을 보면
조건문에서 r1_0.is_deleted is 0 를 사용하고 있습니다.
mySql은 null이나 true, false 와 같은 부울 값을 비교할때만 is를 사용하고
0,1과 같은 값을 비교할 때는 = 연산자를 사용해주어야합니다.
해결
@SQLRestriction("is_deleted is false")
@NoArgsConstructor
public class ReviewEntity extends BaseEntity {
softDelete를 구현하는 코드중에 is를 사용하는 부분이 있어
@SQLRestriction("is_deleted = false")
@NoArgsConstructor
public class ReviewEntity extends BaseEntity {
아래와 같이 변경해주었습니다.