티스토리 뷰

@Query 어노테이션은 쿼리 메서드처럼 메서드 명으로 어떤 기능을 지정하는 것이 아닌, SQL 구문을 직접 작성하여 원하는 작업을 처리할 수 있도록 해주는 어노테이션이다.

 

@Query를 이용하여 할 수 있는 작업

 

1. 필요한 데이터만 선별적으로 추출할 수 있는 기능

2. 데이터베이스와 맞는 순수한 SQL을 사용 가능

3. insert, update, delete와 같은 DML 등을 처리 가능(단, @Modifying 과 함께 사용)

 

@Query 는 JPQL로 객체 지향 쿼리이다. 

즉, 테이블 대신 엔티티 클래스 & 속성명 대신 엔티티 클래스의 맴버 변수를 이용하여 쿼리를 작성해야 한다.

 

크게 어렵지는 않다. 

 

바로 확인해보자.


◎Repository.java(interface)

package com.example.demo.repository;

import java.util.List;

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

import com.example.demo.entity.Memo;

public interface MemoRepository extends JpaRepository<Memo, Long> {

	
	// mno 역순으로 정렬하는 메서드
	@Query("select m from Memo m order by m.mno desc")
	List<Memo> getListDesc();
	
	/**
	 * JPQL : Entity class 기준
	 * SQL : Table 기준
	 * JPA 에서는 
	 * SQL : "select * from tbl_memo order by mno desc"
	 * JPQl : "select m from Memo m order by m.mno desc"
	 */
}

 

◎Test.java

package com.example.demo.repository;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.demo.entity.Memo;

@SpringBootTest
public class MemoRepositoryTest {

    @Autowired
    MemoRepository memoRepository;
    
    @Test
    public void testSelectAll() {
    	List<Memo> list = memoRepository.getListDesc();
    	
    	for(Memo memo : list) {
    		System.out.println(memo);
    	}
    }

}

@Query의 파라미터 바인딩 방법

 

1. ~~~와 같이 :파라미터명을 활용하는 방식

 

◎Repository.java(interface)

@Transactional
@Modifying
@Query("update Memo m set m.memoText = :memoText where m.mno = :mno")
int updateMemoText(@Param("mno") Long mno, @Param("memoText") String memoText);

◎Test.java

package com.example.demo.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class MemoRepositoryTest {

    @Autowired
    MemoRepository memoRepository;
    
    @Test
    public void updateTest() {
    	int result = memoRepository.updateMemoText(50L, "updated!");
    	System.out.println(result);
    }
   
}

2. 여러 개의 파라미터를 전달 => 객체를 이용

 

◎Repository.java(interface)

@Transactional
@Modifying
@Query("update Memo m set m.memoText = :#{#param.memoText} where m.mno = :#{#param.mno}")
int updateMemoText(@Param("param") Memo memo);

◎Test.java

package com.example.demo.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.demo.entity.Memo;

@SpringBootTest
public class MemoRepositoryTest {

    @Autowired
    MemoRepository memoRepository;
   
    @Test
    public void updateTest2() {
    	Memo memo = Memo.builder().mno(45L).memoText("Updateed!").build();
    	int result = memoRepository.updateMemoText(memo);
    }
   
}

lombok-builder에 대한 정보는 다음 블로그를 참조하자.

https://tomining.tistory.com/180

 

Lombok @Builder 사용시 기본값 지정하기

Lombok이 무엇인지 간단히 살펴보고 넘어가자. 어떻게 프로젝트에 적용하는지는 언급하지 않는다. 검색을 통해서 알아보자. 가장 기본적인 기능으로 Lombok은 getter/setter method를 만들어 준다. 예를

tomining.tistory.com

 

* 또한, 마찬가지로 update/delete 등을 사용할 때는 @Transactional을 사용해야 하며, 

update사용 시에는 @Modifying 까지 사용해야 한다.

반응형
Comments