본문 바로가기

PROGRAMMING/JPA

[JPQL] JPQL과 기본문법

JPQL(Java Persistence Query Language)

JPQL은 엔티티 객체를 대상으로 하는 쿼리로 JPA의 검색쿼리 문제를 보완한 방식이다.

 

특정 데이터 베이스에 종속적인 네이티브 쿼리를 날릴 때 사용 가능하며

ANSI 표준에 모든 쿼리를 지원한다.

 

데이터 검색을 할 때 테이블이 아닌 엔티티 객체를 대상으로 검색을 해야하는데

모든 데이터 베이스의 데이터를 객체로 변환해서 검색하는것은 불가능하다.

고로 애플리케이션에 필요한 데이터만 데이터 베이스에서 불러오려면 검색 조건이 포함된 쿼리가 필요하다.

 

JPQL은 엔티티 객체를 대상으로 하는 쿼리를 작성한다면, 

SQL은 데이터베이스 테이블을 대상으로 쿼리한다.

 

결과적으로 보면 JPQL로 짜면 SQL로 번역이 되어 실행된다고 볼 수 있다.

 

한마디로 정의하면 JPQL은 객체지향 SQL

 

Creteria <실무에서 잘 안쓴다>

JPQL로 해결하기 어려운 부분에 사용 가능하다.

JPQL은 결국엔 스트링 문자열이라 동적 쿼리를 만들기 어렵다.

Creteria는 쿼리를 자바로 만드는 방식이라

오타가 나도 컴파일 시점에 잡을 수 있고,  조건을 깔끔하게 걸 수 있는 장점이 있다.

아.. 근데 단점이 개발을 해놔도 가독성이 좋지 않아 유지보수가 힘들다.

 

QueryDSL

현업에서 Criteria대신 사용이 권장된다.

초기 세팅이 필요하긴 하지만 

where대상 컬럼에 오타를 내면 컴파일 시점에서 에러 캐치 가능하며 동적 쿼리도 변수를 바인딩하여 편하게 생성 가능하다.

가독성이 좋아 개발 후 유지보수에 용이하다.

 

기본문법

 

프로젝션

Select 절에 조회할 대상을 지정하는 것

 

엔티티 프로젝션

Select m from member m 

Select m.team from Member m 

 

임베디드 프로젝션  

Select m.address from Member m 

 

스칼라 프로젝션

Select m.username, m.age from Member m 

 

크게 3종류로 나눌 수 있다.

프로젝션으로 가져온 데이터는 영속성 컨텍스트에 의해 관리된다는 특징이 있다.

엔티티/임베디드 프로젝션은 해당 엔티티 클래스로 반환받으면 되지만

스칼라 프로젝션의 경우 3가지 방법으로 값을 반환받을 수 있다.