JPA

JPA JpaRepository 에서 @Query 쿼리작성하여 사용하기(nativeQuery)

dev.mk 2023. 11. 18. 21:25
반응형

JPA에서도 마이바티스처럼 어려운 쿼리를 작성하여 사용할 수 있다.

 

@Query 를 사용하여 여러가지 방법으로 파라미터를 바인딩하여 사용하는 예제다

 

주의할점nativeQuery = true 옵션을 반드시 넣어야한다

 

1. 파라미터 순서로 바인딩

- 파라미터 순서만 맞으면 된다.

- 쿼리문안에서 파라미터는 순서대로 ?1, ?2, ?3, ... 으로 받는다.

- 가독성이 떨어지고 명확하지않아 비추천방법이다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;


public interface BoardRepository extends JpaRepository<Board, Integer>{
    @Query(value="select jb.* from jpa_board jb where jb.bno = ?1", nativeQuery = true)
    Board findByBnoWithNameMatch(@Param("bno") int bno);
}

//SQL 로그
select
    jb.*      
from
    jpa_board jb      
where
    jb.bno = 1

 

 

2. 이름기반 파라미터 바인딩

- @Param을 사용하여 파라미터와 바인딩할 곳 이름을 맞춘다.

- 쿼리문안에서 파라미터는 :{paramName}으로 받는다.

- 많이 사용하는 방법

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;


public interface BoardRepository extends JpaRepository<Board, Integer>{
    @Query(value="select jb.* from jpa_board jb where jb.bno = :bno", nativeQuery = true)
    Board findByBnoWithOrderParam(@Param("bno") int bno);
}

//SQL 로그
select
    jb.*      
from
    jpa_board jb      
where
    jb.bno = 1

 

 

3. 컬렉션으 파라미터 바인딩 (여러개)

특정 SQL (IN 절)에 여러가지 파라미터를 사용할때 사용한다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;


public interface BoardRepository extends JpaRepository<Board, Integer>{
    @Query(value="select jb.* from jpa_board jb where jb.bno in :bnos", nativeQuery = true)
    List<Board> findByBnoWithOrderMultiParam(@Param("bnos") List<Integer> bnos);
}

//SQL 로그
select
    jb.*      
from
    jpa_board jb      
where
    jb.bno in (
        1, 2, 3         
    )
반응형