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 |
댓글