본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA/Spring data JPA

SPRING DATA JPA 공부 3 - QueryMethod 활용

반응형

JPA에서 기본적으로 제공하는 메서드들이 있지만,  where 절에 특정 값을 넣는 경우에는 기본제공 메서드들로 생성하기 한계가 있다 

 

QueryMethod는  Repository에 메소드 이름으로 간편하게 where 절을 구성할 수 있게 해주는 기능이다 . 

 

 

IDE에서 추천을 해주기 때문에 작성하는데에 더욱 편리하다 

 

필드명까지 참조해서 추천해준다  하지만 아래의 추천이 모두 알맞은 쿼리를 작성해 주는 것은 아니기 때문에 

 

아래의 규칙을 한번 보면 좋을 것 같다 . 리턴타입과 메서드명에 관한 규칙들이다

출처 :: https://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.htmlhttps://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.html

 

 

출처 :: https://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.htmlhttps://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.html
출처 :: https://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.htmlhttps://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.html
출처 :: https://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.htmlhttps://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.html

 

package com.ugo.jpatest.repository;

import com.ugo.jpatest.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User,Long>{

    User findByName(String name);
    List<User> findUsersByEmail(String email);
    User findByNameAndEmail(String name,String email);    
}

 

findByName 이라는 메서드를 만들었다  select * from user where name = ? 이런 형식의 쿼리가 나갈 것이다 .

 

테스트에서 한번 리턴 값을 찍어보자 

 

Test

@Test
    void queryMethodTest(){
        userRepository.save(new User("고냥이","stau04@gmail.com"));
        userRepository.save(new User("개냥이","stau04@gmail.com"));

        //이름으로 유저를 찾는다.
        User userByName = userRepository.findByName("고냥이");

        //리턴을 리스트 형식으로 받는다.
        List<User> usersByEmail = userRepository.findUsersByEmail("stau04@gmail.com");

        //And도 추가 가능하다
        User userByNameAndEmail= userRepository.findByNameAndEmail("고냥이","stau04@gmail.com");

        //Top 3 를 가져온다 Last는 안되기 때문에 . OrderBy해서 Top을가져온다

        List<User> userTop3 = userRepository.findTop3ByName("ugo");

        System.out.println("userByName = " + userByName);
        usersByEmail.forEach(user ->{
            System.out.println("userByEmail : "+user);
        });
        System.out.println("userByNameAndEmail = " + userByNameAndEmail);

        userTop3.forEach(user ->{
            System.out.println("userTop3 : "+user);
        });
    }

 console

 

 

위에 말한대로 추천해 주는대로 되는건 아니다 실수가 일어날 수 있기 때문에 테스트 코드를 작성하는 것이 좋다 . 규칙이 있고 만약 where 절에 들어 갈 것이 많아지면 메서드이름이 엄청 길어 질 것이다 .

 

모든 상황에 사용할 수는 없을 것 같다 . 하지만 간단한 상황에선 참 편한 것 같다. 

반응형