Backend/SpringBoot

Query 어노테이션(JPQL) 및 JPA의 Specification

Dean83 2024. 10. 25. 15:45

서비스 interface 를 통해 DB의 내용을 조회 해 올때, 복잡한 쿼리문을 직접 작성해야 할 경우가 있다. 직접 쿼리문을 작성하려면 @Query 어노테이션을 이용하여, Repository에 선언을 해주고, 코드로 구현한다면, Service 에 Specification을 이용해 작성해 준다.  

 

  • @Query 어노테이션
    •  유의점
      • 쿼리문 작성시, 실제 DB 테이블의 컬럼명이 아닌, 엔티티의 변수명을 기준으로 작성해야 한다. (JPQL 이라고 한다)
      • 사실, 일반 쿼리문을 통해서도 쿼리를 수행할 수도 있다.
        • nativeQuery = true 옵션을 붙여주면 된다.
          • @Query(value = "....." , 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