Native Query | JPQL |
---|---|
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);
리턴값이 꼭 엔티티일 필요가 없다.
nativeQuery 속성을 지정해서 데이터베이스에 사용하는 SQL을 그대로 사용할 수 있다.
Repository에 지정된 엔티티 타입뿐아니라 필요한 엔티티 타입을 다양하게 사용할 수 있다.
@Query에 대한 해석은 프로젝트 로딩 시점에서 이루어진다. 따라서 @Query의 내용은 프로젝트가 시작되면서 검증되기 때문에 만일 @Query의 내용물이 잘못될 경우에는 프로젝트가 정상적으로 실행되지 않는다.
JPQL과 SQL의 차이점
select m from Member as m where m.name = 'stringbuckwheat';