스프링 공부/JPA

[JPA] 21. Re.Zero : JPQL로 다시 시작하는 프로젝트!

장아장 2023. 1. 19. 17:45

JQPL

객체지향 쿼리. 즉, 엔티티를 위한 쿼리이다. 

 

JPQL의 문법을 보면, 

일반 sql문과 크게 다를게 없어 보인다는 생각도 든다. 

 

Select * from Member where Member.age > 18; (SQL)

Select m from Member as m where m.age > 18; (JPQL)

정말 비슷하다. 

*인가 m인가 말고는 큰 차이가 보이지 않을 정도이다. 

 

심지어 테이블명, 속성명에서 대소문자를 구분한다는 것도 동일하다.

차이점은, JPQL은 클래스명을 사용한다는 것이다. 

 

특이점은, 별칭(Memer as m)이 쓰인다는 것이다. 

 

Count, sum, avg, max, min, group by, having, order by 등 모든 것을 다 쓸 수 있다. 

 

이를 변수로 받을 때, TypeQuery, Query의 두 가지로 받을 수 있는데, 

Type은 쿼리문을 통해 반환되는 값이 명확할 떄 사용한다. 

즉, 위의 Select m from Member as m where m.age > 18;의 JPQL에서는 반환값이 Member타입의 리스트인것을 알 수 있다. 

이럴 때 TypeQuery를 사용하게 되는 것이다. (말 그대로 무슨 Type인지 정해지는 것이다. )

 

결과 조회

결과가 여러개라면 .getResultList, 하나면 .getSingleResult로 반환시키게 하면 된다. 

이런 식으로 만들게 되는데, 조심해야 할 부분이 하나 있다. 

getResultList는 결과가 없으면 빈 리스트를 반환한다. 

하지만, getSingleResult는 값이 존재하지 않으면, 그리고 값이 여러개면 예외처리된다. 

 

그렇다면, 자바에서 사용한 변수를 쿼리문으로 넣을 떄 어떻게 해야 할까?

setParameter를 이용한다. 

 

이런식으로 똑같은 두 가지의 연산 결과를 변수화 시켜서 작동시킬 수 있다. 

(이게 있는지는 저번 강의에서는 몰랐는데… 이거라도 있으면 조금씩 조작해서 쓸 수 있지 않을까 싶긴 하다….ㅋㅋㅋ)