SpringData JPA를 사용하여 웹 프로젝트를 진행하면서 Select Query를 작성 시 잊어버리게 되어 검색을 하게 되는데 자주 사용하는 내용들을 정리하였습니다. JpaRepository를 상속받아 사용하는 기본 Query와 @Query 주석을 사용하여 JPQL 및 네이티브 SQL 쿼리를 실행하는 방법에 대해 알아보겠습니다.
Entity
먼저 데이터베이스에 저장하기 위해 tb_user 테이블 이름의 Entity 클래스를 작성합니다.
JPQL과 Native SQL 동일하게 @Query 어노테이션을 사용하여 쿼리를 작성하고, 또한 두 가지 방법으로 쿼리에 메소드의 매개변수 값을 전달할 수 있습니다.
@Param 어노테이션을 사용하여 이름으로 정의 된 매개변수를 쿼리에 전달합니다.
메소드의 매개변수 순서로 쿼리에 전달합니다.(1부터 시작)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
@Query(value = "SELECT u FROM User u WHERE u.role = 'GUEST'") List<User> findByRole();
@Query("SELECT u FROM User u WHERE u.userId = :userId") User findByUserId(@Param("userId") String userId);
@Query("SELECT u FROM User u WHERE u.userId = :userId and u.password = :password") User findByUserIdAndPassword(@Param("userId") String userId, @Param("password") String password);
@Query("SELECT u FROM User u WHERE u.userId = ?1") User findByUserId(String userId);
@Query("SELECT u FROM User u WHERE u.userId = ?1 and u.password = ?2") User findByUserIdAndPassword(String userId, String password);
Native SQL
네이티브 SQL을 사용하여 쿼리를 정의할 수 있습니다. 네이티브 SQL을 사용하려면 nativeQuery 속성의 값을 true 로 설정합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
@Query(value = "SELECT * FROM tb_user u WHERE u.role = 'GUEST'", nativeQuery = true) List<User> findByRole();
@Query("SELECT * FROM tb_user u WHERE u.userId = :userId", nativeQuery = true) User findByUserId(@Param("userId") String userId);
@Query("SELECT * FROM tb_user u WHERE u.userId = :userId and u.password = :password", nativeQuery = true) User findByUserIdAndPassword(@Param("userId") String userId, @Param("password") String password);
@Query("SELECT * FROM tb_user u WHERE u.userId = ?1", nativeQuery = true) User findByUserId(String userId);
@Query("SELECT * FROM tb_user u WHERE u.userId = ?1 and u.password = ?2", nativeQuery = true) User findByUserIdAndPassword(String userId, String password);