정의
- 객체 지향 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 |
댓글