본문 바로가기
Spring/Spring Data JPA

JPQL(Java Persistence Query Language)

by Mecodata 2024. 4. 5.

정의

- 객체 지향 DB의 엔티티에 대한 쿼리를 정의하기 위한 객체 지향 쿼리 언어로 JPA의 일부분 중 하나

- DB의 테이블(Table)이 아닌 Spring에서 정의한 엔티티(Entity)를 기준으로 함

테이블과 엔티티의 차이

- 테이블 = DB 혹은 SQL 상에 실제로 존재하며 행과 열의 물리적인 구조를 가지고 있음

- 엔티티 = DB나 SQL 상에 실제로 존재하지 않고 OOP에서 개체를 나타내는 추상적인 개념이며 Java와 같은 객체 지향 언어에서 필드와 메소드를 포함하는 클래스로 정의됨 

 

주의 사항

1. 쿼리문에 *를 사용할 수 없음

2. 오류는 발생하지 않지만 엔티티명의 첫 글자는 대문자로 입력하는 것이 일반적인 관례

3. @Entity(name=)을 통해 엔티티명을 별도로 지정하지 않는 경우 쿼리문에 엔티티명 입력 시 클래스명을 입력해야 함

public class CarListDto {}
@Query("SELECT c FROM CarListDto c") 

@Entity(name="Car_LIST")
public class CarListDto {}
@Query("SELECT c FROM CAR_LIST c")

4. @Column(name=)을 통해 DB의 컬럼명을 지정하였어도 JPQL에서 쿼리문을 작성할 때는 컬럼명을 입력할 때 DB 기준의 컬럼명이 아닌 JPA 엔티티 기준 클래스에서 정의한 필드명으로 입력해야 함

@Entity(name="CAR_LIST")
public class carListDto {

	@Column(name="CAR_TYPE")
	private String carType;

}

@Query("SELECT carType FROM CAR_LIST") // O
@Query("SELECT car_type FROM CAR_LIST") // X

5. INSERT문을 지원하지 않음 (사용하려면 @Query에서 JPQL이 아닌 SQL을 사용하기 위해서 nativeQuery=true 입력)

- nativeQuery=true → SQL
- nativeQuery=false (default) → JPQL 

6. @Query를 통해 JPARepository 확장 클래스에서 INSERT, UPDATE, DELETE 문이 실행되도록 메소드를 정의할 경우  @Modifying과 @Transactional 적용 필수

쿼리 메소드 사용 시에는 @Transactional만 적용하면 됨

@Repository
public interface carRepository extends JpaRepository<carDto, String> {
	
    	@Modifying
	@Transactional
	@Query(value="INSERT INTO CAR_LIST (type, color) VALUES (?1, ?2) WHERE car_id=?3",
    	       nativeQuery=true) // SQL O, JPQL X
	public void insertCarList(String type, String color, String carid);
    
	@Modifying
	@Transactional
	@Query("UPDATE CAR_LIST SET type=:type, color=:color WHERE car_id=:carid")
	public void updateCarList(@Param("type") String type, @Param("color") String color, 
    				     @Param("carid") String carid);
	
   	@Modifying
	@Transactional
	@Query("DELETE FROM CAR_LIST WHERE car_id=?1")
	public void deleteCarList(String carid);
    
    	@Transactional
	public void deleteByCarId(String carid);
    
}

'Spring > Spring Data JPA' 카테고리의 다른 글

Q클래스  (0) 2025.07.12
JPA 정의  (0) 2024.04.08
spring.jpa.hibernate.ddl-auto  (0) 2024.03.19
@AllArgsConstructor 지양 이유 및 대책  (0) 2024.02.26

댓글