Spring Data JPA - 쿼리 메소드, Sort, Named Query, SPEL
Spring Data JPA
백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글
쿼리 생성하기
쿼리는 Spring Data Common에 각 저장소마다 다르다.
스프링 데이터 몽고, 스프링 데이터 레디스 등이 모두 다르다는 이야기다.
JPA용 키워드가 별개로 있는데, 기본적으로 키워드는 굉장히 많다.
거기서 내가 모르는 것들만 좀 기록해보자면,
StartWith(해당 문자열로 시작하는 조건), EndingWith(반대), Containing(포함된 경우)
@NamedQuery(name = "클래스.메소드명, query = "JPQL 쿼리")
NamedQuery의 경우 Repository에 메소드를 정의하면 된다.
그럼 NamedQuery 애노테이션에 정의된 쿼리를 찾아서 실행한다.
@NamedNativeQuery
는 위 네임드 쿼리와 동일한데 쿼리가 네이티브 쿼리라는 것이 차이점.@Query
라는 애노테이션을 Repository 메소드 위에 선언해서 JPQL을 사용할수도 있다. 물론 Native Query를 사용하는 것도 가능하다.
Sort
Sort는 간단하다 메소드 인자로 Sort 클래스를 받아주면 된다.
postRepository.findByTitle("Spring",Sort.by("title")
Sort에 사용할 수 있는 값은 프로퍼티 또는 alias가 엔터티에 있는 경우
Named Parameter과 SpEL
@Query("SELECT p FROM Post AS p WHERE p.title = ?1")
fun findByTitle(title:String, sort:Sort):List<Post>
일반적인 JPQL 쿼리에서는 쿼리를 할 때 채번을 해야했다.
@Query("SELECT p FROM Post AS p WHERE p.title = :title")
fun findByTitle(@Param("title") title:String, sort:Sort):List<Post>
그러나 Named Paramter를 사용하면 채번으로 참조하지않고 이름으로 참조할 수 있다.
SPEL이란
스프링 표현언어인데 특이한 문법을 사용할 수 있다.
가령
@Query("SELECT p FROM #{#entityName} AS p WHERE p.title = :title")
fun findByTitle(@Param("title") title:String, sort:Sort):List<Post>
Entity 이름을 변수로 사용할 수 있다.
가령 #{#entityName}
처럼 일반 변수를 이름으로 사용할 수 있다.
이 SPEL은 스프링 프레임워크에서 지원하는 언어이다.
이 언어를 사용하면 스프링 내에서 특별한(?) 문법을 사용할 수 있다.
이 때 Spring Data 또한 SPEL을 지원하고 있으며 entity의 이름을 변수로 사용하는 것이 가능하다.
Reference
인프런 백기선님의 스프링 Data JPA