Backend/SpringBoot

Query 어노테이션 및 JPA의 Specification

Dean83 2024. 10. 25. 15:45

서비스 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 어노테이션을 쓰는게 나아 보이긴 한다.