서비스 interface 를 통해 DB의 내용을 조회 해 올때, 복잡한 쿼리문을 직접 작성해야 할 경우가 있다. 직접 쿼리문을 작성하려면 @Query 어노테이션을 이용하여, Repository에 선언을 해주고, 코드로 구현한다면, Service 에 Specification을 이용해 작성해 준다.
- @Query 어노테이션
- 유의점
- 쿼리문 작성시, 실제 DB 테이블의 컬럼명이 아닌, 엔티티의 변수명을 기준으로 작성해야 한다. (JPQL 이라고 한다)
- 사실, 일반 쿼리문을 통해서도 쿼리를 수행할 수도 있다.
- nativeQuery = true 옵션을 붙여주면 된다.
- @Query(value = "....." , nativeQuery = true)
- nativeQuery = true 옵션을 붙여주면 된다.
- 쿼리 작성시 인자값
- where 절 등 인자값을 통해 쿼리문을 완성해야 할 필요가 있는데, 이때에는 @param 어노테이션을 이용한다.
- 유의점
//Repository interface 에서,
public interface repo extends JpaRepository<entity1, Long>{
.....
@Query("select from entitity1 e where e.name like %:key%")
entity1 GetEntityQuery(@Param("key") String key);
.....
}
- update, delete 시에는 @Modifying 을 이용해야 한다.
- 만일, 벌크 쿼리를 수행한다면, (update, delete) Persistance Context를 거치지 않아 불일치가 되므로, clearAutomatically = true 설정을 해줘야 한다.
- @Modifying(clrearAutomatically = true) 어노테이션을 붙인다.
- Specification
- 솔직히 복잡해서 뭐가 뭔지 잘 모르겠다만 대략적으로 이해는 간다.
package com.example.test1.test1;
import org.springframework.stereotype.Service;
import org.springframework.data.jpa.domain.Specification;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@Service
public class ServiceClass_Java
{
private final repo _repo;
public ServiceClass_Java(repo _repoItem)
{
this._repo = _repoItem;
}
public Specification<entity1> GetEntityItem(String name)
{
return new Specification<>() {
@Override
public Predicate toPredicate(Root<entity1> e, CriteriaQuery<?> query, CriteriaBuilder bd)
{
query.distinct(true);
return bd.like(e.get("name"), "%" + name + "%");
}
};
}
}
개인적으론 @Query 어노테이션을 쓰는게 나아 보이긴 한다.
'Backend > SpringBoot' 카테고리의 다른 글
| DB 연결 설정 (0) | 2024.10.29 |
|---|---|
| 테스트 코드 작성과 TDD (2) | 2024.10.29 |
| Bean 어노테이션 (W.Configuration, Component 어노테이션) (1) | 2024.10.25 |
| Spring Security 기본 설정 (0) | 2024.10.25 |
| DTO (W. Data, Build 어노테이션) (0) | 2024.10.24 |