[Spring] JPQL과 네이티브 쿼리

gwonsang247·2023년 8월 14일
0

Java

목록 보기
8/11

JPQL이란 DB테이블이 아닌 entity를 대상으로 쿼리를 작성하는 것을 의미한다.

테이블을 대상으로 쿼리를 하는 것이 아니라 엔티티 객체를 대상으로 쿼리를 한다.

SQL과 유사한 문법을 가지며, JPQL도 이후에 SQL로 변환된다.

JPQL 특징

  • 테이블이 아닌 객체를 검색하는 객체지향 쿼리
  • SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않음
  • JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회

JPQL 작성하기

JPQL을 직접 작성하는 방법으로 두가지가있다.

  • EntityManager의 createQuery()로 작성
String query = "SELECT b FROM Board b"; //JPQL 작성
TypedQuery<Board> tQuery = em.createQuery(query, Board.class); // 엔티티 지정
List<Board> list = tQuery.getResultList(); //실행결과를 List<Board>로 반환

여기서 TypeQuery란 반환 알고 있어서 지정할 수 있는 경우에 사용한다.

  • @Query로 작성(메서드 이름은 쿼리와 상관 없음)
public interface BoardRepository extends CrudRepository<Board, Long>{
	@Query("SELECT b FROM Board b") //org.springframework.data.jpa.repository.Query
    List<Board> findAllBoard(); // List<Board> list = boardReop.findAllBoard(); 와 같은 의미
}

@Query 애너테이션을 사용하는 것이 유리하다.


JPQL 매개변수 지정하기

JPQL의 매개변수를 지정하는 방법으로 두가지가 있다. byOrder``byName

  • byOrder 매개변수 순서(default) : ?1은 첫 번 째, ?2는 두 번째 ...
@Query("SELECT b FROM Board b WHERE b.title=?1 AND b.writer=?2")
List<Board> findByTitleAndWriter(String title, String writer);

위 방식은 쿼리가 조회하는 정보가 많아지는 경우 번호 오류가 생길 수 있다.
즉, 복잡한 쿼리에 불리하다.

  • byName 매개변수 이름 : @Paran('이름')으로 바인딩(binding). 생략하면 매개변수 이름으로 바인딩
@Query("SELECT b FROM Board b WHERE b.title = :title AND b.writer = :writer")
List<Board> findByTitleAndWriter(@Param("title") String title, @Param("writer") String writer)

그러므로 매개변수의 이름으로 바인딩하는 것이 유리하다.

JPQL 예시

  • BoardRepository.java (인터페이스 파일)

  • BoardRepositoryTest.jaba (테스트 파일)

0개의 댓글