JPQL 과 query DSL

‍박태우·2024년 10월 18일

nbc_spring

목록 보기
22/28
  • Jpa 에서 제공하는 쿼리 메소드 만으로 조회가 불가능한 경우가 있다.
    => 이런 경우 JPQL 을 이용하여 SQL 과 같이 쿼리를 보낼 수 있다.

JPQL

SQL 이 테이블을 대상으로 쿼리를 하는 반면
JPQL 은 객체를 대상으로 쿼리를 한다.

@Query

  • Query Annotation는 Entity의 JpaRepository를 상속받는 인터페이스에 정의한다.
public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "쿼리문")
    List<User> methodName();
  • 예시
public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "select user " +
    	"from User user " +
        "where user.name = :name")
    List<User> findByName(@Param("name") String name);

쿼리문 작성시 반드시 띄어쓰기를 인지하기 때문에 띄어 쓰기를 해주는 것이 좋다. (문장 구별을 위함)

=> 하지만 띄어쓰기를 신경써야하고, type-check 불가능 및 runtime 오류 발견 가능하다는 단점이 있기 때문에 아래 query DSL 을 주로 사용하긴 한다.


query DSL

  • 개념 : 정적 타입을 이용해서 SQL, JPQL 을 코드로 작성할 수 있도록 도와주는 오픈 소스 빌더 API 이다.

=> 쿼리 내용을 함수 형태로 제공하여 문자열 형태인 JPQL을 보완함

@PersistenceContext
EntityManager em;
 
public List<Person> selectPersonByNm(String firstNm, String lastNm){
	JPAQueryFactory jqf = new JPAQueryFactory(em);
	QPerson person = QPerson.person;
  
	List<Person> personList = jpf
								.selectFrom(person)
								.where(person.firstName.eq(firstNm)
								.and(person.lastName.eq(lastNm))
								.fetch();
                                
	return personList;
}

코드가 길어지기는 했으나 유지 보수 및 타입 체킹이 원활하게 이루어 질 수 있다. (의존성 추가 필요)

profile
잘 부탁드립니다.

0개의 댓글