일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- oauth 로그인
- spring 채팅방
- Androoid Studio
- 로또 등수 코드
- 스프링 오어스
- 멀티뷰
- 로또 앱 만들기
- 로또 등수 알고리즘
- hibe
- .env
- 중간 테이블 엔티티 최적화
- springboot
- 안드로이드 스튜디오
- 스프링 시큐리티 없이
- 뷰 페이징
- jpa dto 매핑
- 채팅방 구현
- 스프링 환경변수 설정
- 쿠버네티스
- android studio
- 스프링 환경변수
- mysql multi-row insert
- 리사이클러뷰 멀티뷰
- java
- 스프링 소셜 로그인
- jpa 최적화
- jpa bulk insert
- 쿠버네티스 #fabric8
- multiview
- 리사이클러뷰
- Today
- Total
야미의 개발
[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 {
아래와 같이 변경해주었습니다.