개발자가 원하는 쿼리를 직접 짜야 하는 그런 상황이 올 때 @Query 는 아주 강력하다.
@Query는 실행할 메서드 위에 정적 쿼리를 작성 한다.
여기 들어가는 쿼리는 JPQL 이라는 쿼리가 들어가야 한다.
Java Persistence Query Language 인 JPQL은 객체지향 쿼리로 JPA가 지원하는 다양한 쿼리 방법 중 하나이다.
이는 JPA가 탄생한 이유인 임피던스 불일치
를 해결하려는 노력의 일환 같다.
쿼리문 내부에 다음과 같이 참조변수.필드 와 같은 형태로 사용된다.
이름 기반으로 파라미터 바인딩을 하고 파라미터에 @Param("") 어노테이션으로 메서드에 들어오는 파라미터가 어떤 이름으로 지정될 지 정할 수 있다.
ex 1)
@Query("select u from User u where u.username = :name")
List<User> methodName(@Param("name") String username);
ex 2)
@Query("SELECT u FROM User u WHERE u.username LIKE %:char% and u.age > :maxAge")
List<User> findByLetterWithConditions(@Param("char") char letter,
@Param("maxAge") int age);
}
단방향 연관관계가 객체지향적으로 봐도, 관심사로 봐도 훨씬 이득이 많다.
그래도 우리는 양방향을 사용해야 하는 어쩔 수 없는 상황들이 생기게 된다.
그럼 다음을 기억하자