@Query, nativeQuery=true, JPQL

메밀·2023년 5월 11일
0
post-thumbnail

1. Native Query vs. JPQL

Native QueryJPQL
SQL문을 DB에 직접 날림엔티티 객체를 쿼리. 테이블이 아니라 엔티티를 대상으로 날림.

보통 JPQL을 사용.

	// JPQL
    @Query(value = "SELECT watering, chemical, plant" +
            " FROM Watering watering" +
            " LEFT JOIN Chemical chemical" +
            " ON watering.chemical = chemical" +
            " JOIN Plant plant" +
            " ON watering.plant = plant" +
            " WHERE plant.gardener.gardenerId = :gardenerId" +
            " AND watering.wateringDate >= :startDate" +
            " AND watering.wateringDate <= :endDate")
    List<Watering> findAllWateringListByGardenerNo(@Param("gardenerId") Long gardenerId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

	// Native Query
    @Query(value = "select chemical_id chemicalId, period, name," +
            " (select MAX(watering_date) from watering w where w.plant_id = :plantId and w.chemical_id = c.chemical_id) latestWateringDate" +
            " from chemical c where c.gardener_id = :gardenerId" +
            " order by period desc", nativeQuery = true)
    List<ChemicalUsage> findLatestChemicalizedDayList(@Param("gardenerId") Long gardenerId, @Param("plantId") Long plantId);

1) @Query

  • 리턴값이 꼭 엔티티일 필요가 없다.

  • nativeQuery 속성을 지정해서 데이터베이스에 사용하는 SQL을 그대로 사용할 수 있다.

  • Repository에 지정된 엔티티 타입뿐아니라 필요한 엔티티 타입을 다양하게 사용할 수 있다.

  • @Query에 대한 해석은 프로젝트 로딩 시점에서 이루어진다. 따라서 @Query의 내용은 프로젝트가 시작되면서 검증되기 때문에 만일 @Query의 내용물이 잘못될 경우에는 프로젝트가 정상적으로 실행되지 않는다.

2) JPQL

  • JPQL은 결국 SQL로 변환된다
  • JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회

JPQL과 SQL의 차이점

select m from Member as m where m.name = 'stringbuckwheat';
  • 대소문자 구분
    • 엔티티 이름(Member), 속성(name)은 대소문자 구분
    • JPQL 키워드(select, from ...)는 구분 X
  • 엔티티 이름
    • 위 예시의 Member는 클래스 이름이 아닌 엔티티 이름! (@Entity(name="Member"))
    • name 속성 생략 시 클래스 이름 사용
  • 별칭 필수
    • Member as m

0개의 댓글