Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기

목차

JPQL (Java Persistence Query Lange) 사용하기

Table 대상이 아닌 Etity(객체) 를 대상으로 작성하는 객체 지향 쿼리

  • 특정 데이터 베이스 SQL에 의존하지 않는 장점이 있다.
  • EntityManager 객체 createQuery 메소드를 사용해 쿼리문을 만들어 줄 수 있다.
  • select 문으로 데이터 조회 후 List, Stream, 단건 데이터 3가지 방식으로 결과를 가져올 수 있다.
메소드 설명
getResultList select 문 실행후 여러 Row 결과 데이터를 List로 반환한다.
getResultStream select 문 실행후 여러 Row 결과 데이터를 Stream 으로 반환한다.
getSingleResult select 문 실행후 한 Row 결과 데이터를 반환한다.
// Read
public List<Member> findAll() {
// JPQL
List<Member> result = em.createQuery("select m from Member m", Member.class)
.getResultList();
return result;
}
public long count() {
return em.createQuery("select count(m) from Member m", Long.class)
.getSingleResult();
}
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m " +
"where m.username = :username " +
"and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
@Test
public void findByUsernameAndAgeGreaterThen(){
Member member1 = new Member("AAA", 10);
Member member2 = new Member("AAA", 20);
memberJpaRepository.save(member1);
memberJpaRepository.save(member2);

List<Member> result = memberJpaRepository.findByUsernameAndAgeGreaterThan("AAA", 15);

assertThat(result.get(0).getUsername()).isEqualTo("AAA");
assertThat(result.get(0).getAge()).isEqualTo(20);
assertThat(result.size()).isEqualTo(1);
}

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

Query 어노테이션을 이용하면 인터페이스 메소드에 JPQL 을 바로 정의할 수 있다.
쿼리문에 오타가 있어도 Application 로딩 시점에 파싱을 진행해 오류를 잡아준다.

@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);
@Test
public void testQuery(){
Member m1 = new Member("AAA", 10);
Member m2 = new Member("AAA", 20);
memberRepository.save(m1);
memberRepository.save(m2);

List<Member> members = memberRepository.findUser("AAA", 10);
assertThat(members.get(0).getUsername()).isEqualTo("AAA");
assertThat(members.get(0).getAge()).isEqualTo(10);
}
Share