본문 바로가기
Spring Data JPA

Spring Data JPA - 쿼리 메서드(1)

by 왈레 2023. 4. 12.

1. 메소드 이름으로 쿼리 생성

Distinct findDistinctByLastnameAndFirstname select distinct …​ where x.lastname = ?1 and x.firstname = ?2
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is, Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull, Null findByAge(Is)Null … where x.age is null
IsNotNull, NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> ages) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstname) = UPPER(?1)

- 보통 조건이 2개 이상 넘어가면 메서드명이 굉장히 길어지는데 이런 경우 다른 방법 채택

- by뒤에 조건이 없으면 전체조회

 

- find…By,query…By, get…By 동일

- remove…by, delete…by 동일

 

- count …by → Long 타입반환

- exists…by → boolean중복제거 : findDistinct, findMemberDistincBy

 

- limit : findFirst3 , findTop3 → 상위 3개, findFirst, findTop → 상위 1개

 

2. NamedQuery (실무에서 잘 안씀)

Entity에 @NamedQuery 어노테이션을 달고 쿼리를 작성한다음 JPA에서는 em.createNamedQuery(””)로 불러올 수 있는데 이 방법은 Spring Data JPA에서는 굳이 안쓰고 @Query를 달아줘서 불러온다. 근데 이것도 주석 처리 가능하다.

그나마 NamedQuery의 장점은 쿼리 에러를 컴파일 시점에서 잡아준다.

em.createNameQuery(””) 괄호 안에 작성된 잘못된 쿼리는 컴파일 시점이 아니라 런타임 시점에 잡힌다.

@Entity
@NamedQuery(
        name = "Member.findByUsername",
        query= "select m from Member m where m.username = :username"
)
public class Member { ... }


public interface MemberRepository extends JpaRepository<Member, Long){
  //createNamedQuery (인터페이스가 아닌 @repository에 구현)
  public List<Member> findByUsername(String username){
  	return em.createNamedQuery("Member.findByUsername", Member.class)
              .setParameter("username", username)
              .getResultList();
  }
  
  //@Query(name = "Member.findByUsername") 주석가능, JPA는 Member의 Namedquery부터 찾음
  List<Member> findByusername(@Param("username") String username);
}

 

3. @Query 

- 이건 이름이 없는 NamedQuery라고 생각하면 되는데, 이것 또한 컴파일 단계에서 쿼리 문법에러를 잡아준다.

- 등록 및 업데이트 쿼리는 @Modifying 어노테이션을 달아준다.

public interface MemberRepository extends JpaRepository<Member, Long> {
  @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);
}

 

4. @Query - 컬럼 하나 조회, DTO 직접 조회

@Data
public class MemberTestDto {

    private Long id;
    private String username;
    private String teamName;

    public MemberTestDto(Long id, String username, String teamName) {
        this.id = id;
        this.username = username;
        this.teamName = teamName;
    }
}

//@Query : 컬럼 하나 조회
@Query("select m.username from Member m")
List<String> findUsernameList();

//@Query: DTO 직접 조회
@Query("select new <패키지 경로명>.MemberTestDto(m.id, m.username, t.name) from Member m join m.team t")
List<MemberTestDto> findMemberDto();
 

'Spring Data JPA' 카테고리의 다른 글

Spring Data JPA - 쿼리 메서드(3)  (0) 2023.04.13
Spring Data JPA - 쿼리 메서드(2)  (0) 2023.04.13

댓글