Spring/SpringDataJPA

@Query, 리포지토리 메소드에 쿼리 정의하기

느리지만 꾸준하게 2022. 4. 17. 15:11

MemberRepository Interface

public interface MemberRepository extends JpaRepository<Member, Long> {

    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

    List<Member> findTop3HelloBy();

    List<Member> findByUsername(@Param("username") String username);

    @Query("select m from Member m where m.username = :username and m.age = :age")
    List<Member> findUser(@Param("username") String username, @Param("age") int age);
}

 

MemberRepositoryTest를 아래와 같이 지정하고 빌드를 돌리면 실행결과가 아래와 같이 나타난다.

@Test
public void testQuery() {
    Member m1 = new Member("AAA", 10);
    Member m2 = new Member("BBB", 20);
    memberRepository.save(m1);
    memberRepository.save(m2);

    List<Member> result = memberRepository.findUser("AAA", 10);
    Member findMember = result.get(0);
    assertThat(findMember).isEqualTo(m1);
}
// build 결과

select
        member0_.member_id as member_i1_0_,
        member0_.age as age2_0_,
        member0_.tema_id as tema_id4_0_,
        member0_.username as username3_0_ 
    from
        member member0_ 
    where
        member0_.username=? 
        and member0_.age=?



select member0_.member_id as member_i1_0_, member0_.age as age2_0_, member0_.tema_id as tema_id4_0_, member0_.username as username3_0_ from member member0_ where member0_.username='AAA' and member0_.age=10;

 

 

 

 

 

아래와 같이 오류를 의도해서 내보내면 build과정에서 에러를 발생시킨다.

public interface MemberRepository extends JpaRepository<Member, Long> {

    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

    List<Member> findTop3HelloBy();

    List<Member> findByUsername(@Param("username") String username);


	// 애플리케이션 로딩시점에 일단 다 파싱을 해버린다. => SQL을 다 만들어 놓는다.
    @Query("select m from Member m where m.usernameasdf = :username and m.age = :age")
    List<Member> findUser(@Param("username") String username, @Param("age") int age);
}
Caused by: org.hibernate.QueryException: could not resolve property: usernameasdf of: study.datajpa.entity.Member [select m from study.datajpa.entity.Member m where m.usernameasdf = :username and m.age = :age]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 실전! 스프링 데이터 JPA >

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard

 

실전! 스프링 데이터 JPA - 인프런 | 강의

스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.

www.inflearn.com

 

'Spring > SpringDataJPA' 카테고리의 다른 글

반환 타입  (0) 2022.04.17
@Query, 값, DTO 조회하기 & 파라미터 바인딩  (0) 2022.04.17
JPA NamedQuery  (0) 2022.04.17
메소드 이름으로 쿼리 생성  (0) 2022.04.15
공통 인터페이스 분석  (0) 2022.04.15