-
<Spring Boot> queryAnnoationSpring Boot 2023. 8. 25. 15:42
queryAnnoation
@Query ("string query") 를 이용해서 수행될 메서드를 직접 정의하는 방법입니다.
형식
@Query("Select m (alias) from (table명) m (alias) oder by m.컬럼명desc")
List<entity> getListDescendig();
alias 는 내가 주고싶은 문자를 주면 된다.
대부분 entity의 첫 자를 소문자로 alias 로 부여한다.
필자는 이번 포스팅에서 m으로 부여하겠다.
위 쿼리에는 DB 에서의 함수들도 그대로 사용가능합니다.
만약 조건절에 들어갈 파라미터가 존재한다면,
PreparedStatment 처럼 위치 홀더 같은 키워드를 이용해서 파라미터 데이터를 바인딩 시킬 수 있습니다.
홀더타입
- ? : 자바의 삼항연산자와 같음
- ':xxx' -> 파라미터 이름을 맵핑
- :#{} : 자바 beans 의 action 태그처럼 beans 의 properties를 맵핑하는 형태
주의!! 한번에 Select 와 Insert, Update, delete 등이 동시에 수행될 때는
@Transaction 을 이용해서 commit, rollback 등을 처리해야하고,
떄에 따라서 @Modifying 등을 이용해야합니다.
문법
@Query("update TableName alias alias.컬럼명 = :parameter where m.컬럼명 = :mno")
위에서 선언된 쿼리에 파라미터를 매핑하도록 메서드에서 선언해야합니다.
아래는 위 쿼리가 update 구문이니 리턴이 1인경우 해당 값을 리턴하도록 int 리턴하고 메서드명을 선언합니다.
@Param 을 이용해서 쿼리에 파라미터를 매핑합니다.
int UpdateMemoText(@Param("컬럼명") 컬럼type 컬럼명, @Param("컬럼명") 컬럼 type 컬럼명)
코드로 보여드리겠습니다.
package comfullstack2.ph1; import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import comfullstack2.ph1.entity.Memo; import jakarta.persistence.Entity; public interface MemoRepository extends JpaRepository<Memo, Long >{ @Query("update Memo m set m.memotext = :memotext where m.mno = :mno") // entity 주기 int updateMemoText(@Param("mno") Long mnoLong, @Param("memotext") String memotext); }
해당 컬럼을 update 하는 updateMemoText 라는 메서드를 생성하였습니다.다음으로는 Spring Boot에서 test 파일에서 test 해보겠습니다.
package comfullstack2.ph1; import static org.mockito.ArgumentMatchers.nullable; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.test.annotation.Commit; import java.util.List; import java.util.Optional; import java.util.stream.IntStream; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import comfullstack2.ph1.entity.Memo; import org.springframework.transaction.annotation.Transactional; @SpringBootTest class Fullst2springDb1ApplicationTests { @Autowired MemoRepository memoRepository; // 인터페이스 타입에 빈즈를 생성한다, @Commit @Transactional @Test void queryAnnoation() { System.out.println(memoRepository.updateMemoText(50273L,"오늘 포스팅 끝")); } }
콘솔에서의 실행결과
콘솔에 1이 뜨는 이유
int updateMemoText(@Param("mno") Long mnoLong, @Param("memotext") String memotext);
update 가 된 갯수를 리턴하므로
필자의 코드에선 1개만 update 쳤으니 1이 리턴 되는 것이다.
DB에서의 실행결과
'Spring Boot' 카테고리의 다른 글
<Spring Boot> 간단한 스프링부트를 이용한 회원가입, 로그인 (0) 2023.09.05 < Spring Boot > ThymLeaf (0) 2023.08.30 <Spring Boot> queryMethod (0) 2023.08.25 < Spring Boot > Repository (0) 2023.08.25 < Spring Boot > Entity (0) 2023.08.25