티스토리 뷰

jpa

JPQL-Limit절 사용 불가 문제 해결

cocoyoung 2023. 8. 28. 15:40
이 글은 우리FISA 클라우드 서비스 개발자 굿프렌즈팀 `Been`이 작성했습니다.

JPQL이란?

  • JPQL은 Java Persistence Query Language의 약어로, 엔티티 객체를 조회하는 객체지향 쿼리입니다.
  • JPA에서 제공하는 메소드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제 해결을 위해 탄생하였습니다.
     

JPQL 특징

  • 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리합니다.
  • SQL과 비슷한 문법을 가지며, 결국 SQL로 변환됩니다.
  • JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회합니다.

기본 문법

//검색
String jpql= "select m From Member m where m.name like '%hello%'";

List<Member> result = em.createQuery(jpql, Member.class).getResultList();
  1. 엔티티와 속성은 대소문자를 구분합니다.(키워드는 x)
  2. 클래스 이름이 아닌 엔티티 이름을 사용하는데, @Entity(name = “이름”) 으로 지정해주지 않은 경우는 기본 값으로 클래스 이름이 사용됩니다.
  3. 별칭 반드시 명시해야하며, AS는 생략이 가능합니다.

이번 프로젝트에서 JPQL을 활용한 방법에 대해 설명드리겠습니다.

@Query

  • @Query 어노테이션은 JPQL을 작성하기 위한 방법 중 하나로, 엔티티의 JpaRepository를 상속받는 인터페이스에 정의합니다.
  • FROM 구문에 엔티티 객체를 선언하여 해당 객체의 속성명을 통해 조건과 파라미터를 작성합니다.
  • 파라미터 바인딩을 위해 @Param과 : 을 이용합니다.
    • 아래 코드를 확인해보시면 @Param과 : 을 이용하여 productId를 바인딩한 것을 확인하실 수 있습니다.
public interface ProductImageRepository extends JpaRepository<ProductImage, Long> {
    
  @Query("select pi.imageUrl from ProductImage pi where pi.product.id = :productId")
  List<String> findAllImageUrlByProductId(@Param("productId") Long productId);

}

 

JPQL - Limit절 사용 불가

JPQL은 Limit 절을 사용할 수 없습니다.

따라서 이를 보완하기 위해 이번 프로젝트에 적용한 방법을 설명드리겠습니다.

nativeQuery

  • @Query의 속성으로, nativeQuery = true를 추가하면 value에 jpql이 아닌 sql 쿼리문을 사용할 수 있습니다.
  • 이 속성을 이용하여 limit절을 사용할 수 있었습니다.
public interface ProductImageRepository extends JpaRepository<ProductImage, Long> {

  @Query(value = "select pi.image_url from profile_images pi where pi.product_id = :productId limit 1",
         nativeQuery = true)
  String findOneImageUrlByProductId(@Param("productId") Long productId);

}

 

참고자료

JPQL이란

JPQL사용방법

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함