서비스 interface 를 통해 DB의 내용을 조회 해 올때, 복잡한 쿼리문을 직접 작성해야 할 경우가 있다. 직접 쿼리문을 작성하려면 @Query 어노테이션을 이용하여, Repository에 선언을 해주고, 코드로 구현한다면, Service 에 Specification을 이용해 작성해 준다.
- @Query 어노테이션
- 유의점
- 쿼리문 작성시, 실제 DB 테이블의 컬럼명이 아닌, 엔티티의 변수명을 기준으로 작성해야 한다.
- 쿼리 작성시 인자값
- 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);
.....
}
- 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 |
---|---|
테스트 코드 작성 (2) | 2024.10.29 |
Bean 어노테이션 (W.Configuration, Component 어노테이션) (1) | 2024.10.25 |
Spring Security (Configuration, EnableWebSecurity 어노테이션) (0) | 2024.10.25 |
DTO (W. Data, Build 어노테이션) (0) | 2024.10.24 |