library

data JPA

JPQL

Querydsl 샘플 소스 모두 있습니다.

 

 

data JPA In 절 사용하기

 

핵심 요약

  1. 명명 규칙에 맞춰 작성한 메소드의 이름에 In을 붙인다.
  2. 매개변수를 List 타입 (또는 Array) 으로 변경한다.

 

https://javadeveloperzone.com/spring/spring-jpa-query-in-clause-example/

 

Spring JPA query IN clause example - Java Developer Zone

Here is article of Spring JPA query IN clause example and Spring data JPA IN and NOT IN query with example, dyanic IN and NOT IN query with spring JPA.

javadeveloperzone.com

위 링크는 공식 문서입니다. 공식 문서를 찾아 들어가면 아래와 같은 문법이 보입니다.

 

위 그림을 설명하기에 앞서, JPA의 경우 메소드 이름을 네이밍 규칙에 맞춰 작성할 경우, 해당 네이밍을 이용해서 쿼리를 적절하게 생성해줍니다.

그리고 아래 그림을 봅니다.

 


보면, employee 테이블에서 EmployeeName 이라는 필드로 select 쿼리를 만들어 줌을 의미합니다.

거기에 매개변수를 보면 List 형태의 매개변수가 보입니다.

그리고 @Param("names") 어노테이션은, 들어오는 매개변수가 어떤 컬럼과 매칭 될 것인가를 결정합니다.

이 어노테이션을 작성하지 않을 경우, 자동으로 매개변수의 이름인 names 를 컬럼 이름으로 매핑해줍니다.

위, 문서의 내용처럼 매개변수의 형태를 List로 변경하고 메소드 이름에 이름에 In 만 붙여주면, 쿼리의 조건절을 in으로 생성 해줍니다.

 

 

 

 

 

JPQL In 절 사용하기

 

JPQL 로 in 절을 사용하는 것은 매우 쉽습니다.

JPQL 이 지원하는 in 키워드를 사용한 후, List or Array 타입을 파라미터로 넘겨주면 됩니다.

    @Query("select c from Cup c where c.id in :cups")
    List<Cup> findCupsIn(Long[] cups);

직접 EntityManager 를 호출하시는 경우에는 다음과 같이 할 수 있습니다.

public List<Cup> findByCupIdIn(Long[] cups) {
    return em.createQuery("select c from Cup c where c.id in :cups")
            .setParameter("cups", cups)
            .getResultList();
}

여기서 em 은 EntityManager 의 인스턴스 입니다.

 

 

 

Querydsl In 절 사용하기

 

Querydsl 로 In 절을 사용하는 것은 더더욱 쉽습니다.

where 조건에 대상 Q 엔티티에 in 을 추가하면 됩니다.

    private final JPAQueryFactory jpaQueryFactory;

    public List<Member> getMembers(Long[] ids) {
        return jpaQueryFactory
                .select(member)
                .from(member)
                .where(member.id.in(ids))
                .fetch();
    }

이때 member 는 QMember 의 인스턴스 입니다. (static import)