티스토리 뷰
@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
* 또한, 마찬가지로 update/delete 등을 사용할 때는 @Transactional을 사용해야 하며,
update사용 시에는 @Modifying 까지 사용해야 한다.
반응형
'[JAVA] > Spring-Boot' 카테고리의 다른 글
[Spring-Boot] Thymeleaf 2: Thymeleaf 문법 (0) | 2021.07.08 |
---|---|
[Spring-Boot] Thymeleaf 1: 시작하기 (0) | 2021.07.08 |
[Spring-Boot] Spring Data JPA 2: 쿼리 메서드 (0) | 2021.07.08 |
[Spring-Boot] Spring Data JPA 1: 시작하기 (0) | 2021.07.07 |
[Spring-Boot] Spring Data JPA 1차 정리(비공개) (0) | 2021.07.07 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- 파니노구스토
- javascript
- 이탈리안 레스토랑
- react-native
- 인천 구월동 맛집
- redux
- 정보보안기사 #실기 #정리
- await
- redux-thunk
- 맛집
- Promise
- Async
- react
- AsyncStorage
- 인천 구월동 이탈리안 맛집
- Total
- Today
- Yesterday