Spring Boot

<Spring Boot> queryAnnoation

98kg 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에서의 실행결과