JPQL이란 DB테이블이 아닌 entity를 대상으로 쿼리를 작성하는 것을 의미한다.
테이블을 대상으로 쿼리를 하는 것이 아니라 엔티티 객체를 대상으로 쿼리를 한다.
SQL과 유사한 문법을 가지며, JPQL도 이후에 SQL로 변환된다.
JPQL 특징
JPQL을 직접 작성하는 방법으로 두가지가있다.
String query = "SELECT b FROM Board b"; //JPQL 작성
TypedQuery<Board> tQuery = em.createQuery(query, Board.class); // 엔티티 지정
List<Board> list = tQuery.getResultList(); //실행결과를 List<Board>로 반환
여기서 TypeQuery란 반환 알고 있어서 지정할 수 있는 경우에 사용한다.
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의 매개변수를 지정하는 방법으로 두가지가 있다. 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)
그러므로 매개변수의 이름으로 바인딩하는 것이 유리하다.
BoardRepository.java (인터페이스 파일)
BoardRepositoryTest.jaba (테스트 파일)