<Spring Boot> queryAnnoation
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에서의 실행결과