JPA | @Query

DoItDev·2021년 9월 14일
1
post-thumbnail

@Query

Note:

  • 엔티티에 대한 쿼리를 선언하기 위한 어노테이션이다.
  • @Table 로 명시되어 있는 엔티티로 사용이 가능하다.
  • 데이터에 변경이 일어나는 INSERT, UPDATE, DELETE, DDL 에서 사용이 가능하다.
  • 쿼리 자체는 쿼리를 실행하는 java 메소드에 연결이 되어 있다.
  • native query 또한 사용이 가능하다.

@Query 쿼리 메소드 사용법

@Repository
public interface AuthRepository extends JpaRepository<Auth, Long> {
@Override
@Query("select auth from Auth auth where auth.id =: id")
Optional<Auth> findById(@Param("id") Long id);
}

Like절 사용법

like절을 아래와 같은 기술로 정의 가능하다.
startWith, 등 .. 복잡한 로직도 정의 가능하다.

@Query("select auth from Auth auth where auth.authName like %?1")
List<Auth> findByAuthNameEndsWith(String authName);

native query

@Query 어노테이션에서 속성을 nativeQuery = true 를 사용하면 된다
기본적으로는 false 이다.

@Query(value = "select auth from Auth auth where auth.authName like %?1" , nativeQuery = true)
List<Auth> findByAuthNameEndsWith(String authName);

NameSapce 파라미터의 사용

name space 로 파라미터를 사용하기 위해서는 메소드 파라미터 앞에 @Param 어노테이션을 사용을 해준다.
명시된 name 을 @Query에서 명시가 가능하다.
ex) =:id

@Repository
public interface AuthRepository extends JpaRepository<Auth, Long> {
    @Override
    @Query("select auth from Auth auth where auth.id =: id")
    Optional<Auth> findById(@Param("id") Long id);
}

Warning:

버전4 이상부터 컴파일러 플래그 기반으로하는 java8 이상부터 지원을 한다.
매개변수를 명시를 해주었던 것을 @Param 을 생략이 가능하다.


Update Query

update query를 만들 수 있다.
@Modifying 어노테이션을 사용하면 update 쿼리를 메커니즘 하게 사용이 가능하다.

@Modifying
@Query("update Auth auth set auth.authName = :authName where auth.id = :id")
long setFixedAuthNameFor(@Param("authName") String authName, @Param("id") Long id);

Delete Query

delete query 도 사용이 가능하다.
@Modifying 어노테이션을 사용하면 update 쿼리를 메커니즘 하게 사용이 가능하다.

@Modifying
@Query("delete from Auth auth  where auth.authName = :authName")
void deleteByAuthName(@Param("authName") String authName);

Sort

Note:

PageRequest 를 직접 제공하거나 Sort 를 사용하여서 정렬이 가능합니다.
또한 엔티티에서 order 어노테이션을 사용하여서 정렬이 가능합니다.
sort의 값의 경우 인스턴스내에서 실제 도메인 속성으로 명시를 시켜야합니다.
JpaSort 라는 객체가 있는데 이 클레스는 JpaSort.unsafe를 사용하여 잠재적으로 안전하지 않은 순서를 추가할 수 있다.

@Query("select auth from Auth auth where auth.authName =: authName")
List<Auth> findByAuthName(String authName, Sort sort);

// 사용법
repository.findByAuthName("System" , Sort.by("id"));

참조

spring - 공식홈페이지

profile
Back-End Engineer

0개의 댓글