Database ( DB )/JPA, Querydsl

Spring Data Jpa에서 Native Query를 사용하는 방법

노루아부지 2023. 2. 25. 23:57
반응형

Spring Data JPA는 Java Persistence API (JPA)를 기반으로 구현된 라이브러리입니다. 이를 사용하면 Java 객체와 관계형 데이터베이스 간의 매핑을 쉽게 할 수 있습니다.

Spring Data JPA는 JPQL (Java Persistence Query Language)을 지원합니다. 하지만 때로는 JPQL로는 해결하기 어려운 쿼리가 있습니다. 이럴 때는 네이티브 쿼리 (Native Query)를 사용할 수 있습니다. 네이티브 쿼리는 SQL 문법을 사용하여 데이터베이스와 상호작용할 수 있습니다.

Spring Data JPA에서 네이티브 쿼리를 사용하려면 다음과 같은 단계를 따르면 됩니다.

 

1. 엔티티 클래스에서 @SqlResultSetMapping 어노테이션을 사용하여 매핑 정보를 정의합니다. 이를 통해 네이티브 쿼리 결과를 엔티티 클래스와 매핑할 수 있습니다.

@SqlResultSetMapping(
  name = "employeeResult",
  classes = {
    @ConstructorResult(
      targetClass = Employee.class,
      columns = {
        @ColumnResult(name = "id", type = Long.class),
        @ColumnResult(name = "name", type = String.class),
        @ColumnResult(name = "age", type = Integer.class)
      }
    )
  }
)
@Entity
public class Employee {
  //...
}

 

Repository 인터페이스에 네이티브 쿼리를 정의합니다. @Query 어노테이션을 사용하고 nativeQuery 속성을 true로 설정합니다. 결과를 매핑할 @SqlResultSetMapping 이름을 지정합니다.

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

  @Query(
    value = "SELECT id, name, age FROM employee WHERE age > :age",
    nativeQuery = true,
    resultSetMapping = "employeeResult"
  )
  List<Employee> findEmployeesByAgeGreaterThan(int age);
}

위 예제에서 Employee 클래스는 @SqlResultSetMapping을 사용하여 네이티브 쿼리 결과를 매핑할 수 있도록 정의되었습니다. EmployeeRepository 인터페이스에서 @Query 어노테이션을 사용하여 네이티브 쿼리를 정의하고 resultSetMapping 속성에 employeeResult를 지정하여 결과를 매핑합니다.

이제 EmployeeRepository를 사용하여 findEmployeesByAgeGreaterThan 메서드를 호출하면 age보다 많은 나이를 가진 직원 목록을 반환하는 네이티브 쿼리가 실행됩니다.

List<Employee> employees = employeeRepository.findEmployeesByAgeGreaterThan(30);
728x90
반응형
loading