JPA - JPQL 서브쿼리 (객체지향 쿼리 언어)

2019. 2. 9. 14:49Web/JPA

JPA - JPQL 서브쿼리 (객체지향 쿼리 언어),컬렉션 식


JPQL도 서브 쿼리를 지원하지만 몇 가지 제약사항이 존재한다.


-WHERE, HAVING 절에서만 사용할 수 있고, SELECT,FROM절에서는 사용할 수 없다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
 * 서브쿼리 - SQL과 다르게 where,having 절에서만 사용가능하다.
 */
public void subQuery() {
    String jpql = "select m from MemberJPQL m where m.age > (select avg(m2.age) from MemberJPQL m2)";
    TypedQuery<MemberJPQL> query = em.createQuery(jpql,MemberJPQL.class);
    List<MemberJPQL> teams = query.getResultList();
 
    System.out.println("================subQuery=================");
 
    for(MemberJPQL m : teams) {
        System.out.println(m.toString());
    }
    System.out.println("================subQuery=================");
}
cs



서브쿼리함수



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * 서브쿼리 함수
 * [NOT] EXISTS (subquery) - subquery에 결과가 존재하면 참이다. NOT은 반대
 * {ALL | ANY | SOME } (subquery) - ALL 서브쿼리의 모든결과가 참이면 참, ANY 서브쿼리의 결과중 아무거나 참이면 참, 
SOME == ANY(반드시 비교연산자와 사용)
 * [NOT] IN (subquery) - 서브쿼리 결과 중 하나라도 같은 것이 있으면 참이다.
 *                        - 서브쿼리가 아닌 곳에서도 사용가능 ~ IN ('여성게1','여성게2')
 */
public void subQueryFunction() {
    String jpql = "select m from MemberJPQL m where m.age < ALL (select avg(m2.age)"
                +"from MemberJPQL m2)";
 
    TypedQuery<MemberJPQL> query = em.createQuery(jpql,MemberJPQL.class);
    List<MemberJPQL> teams = query.getResultList();
 
    System.out.println("================subQueryFunction=================");
 
    for(MemberJPQL m : teams) {
        System.out.println(m.toString());
    }
 
    System.out.println("================subQueryFunction=================");
 
}
cs




컬렉션식



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * 연관관계 컬렉션에 사용할 수 있는 수식? 컬렉션 식이다.
 * is [not] empty - 연관관계에 있는 컬렉션이 비어있는가?
 * {엔티티나 값} [not] member of {컬렉션 값 연관경로} - 엔티티나 값이 컬렉션에 포함되어있는가?
 */
public void collectionFunction() {
    /*String jpql = "select t from TeamJPQL t where t.members is not empty and t.name ='티스토리1'";*/
    String jpql = "select t from TeamJPQL t where :memberParam member of t.members";
    TypedQuery<MemberJPQL> query2 = em.createQuery("select m from MemberJPQL m where m.username='여성게1'",MemberJPQL.class);
    MemberJPQL member = query2.getResultList().get(0);
 
    TypedQuery<TeamJPQL> query = em.createQuery(jpql,TeamJPQL.class);
    query.setParameter("memberParam", member);
    List<TeamJPQL> teams = query.getResultList();
 
    System.out.println("================collectionFunction=================");
 
    for(TeamJPQL m : teams) {
        System.out.println(m.toString());
    }
 
    System.out.println("================collectionFunction=================");
 
}
cs