객체지향 쿼리 언어5 - SubQuery & 타입표현

  • 소개
  • 기본 문법과 쿼리API
  • 프로젝션(SELECT)
  • 페이징
  • 조인
  • 서브 쿼리
  • JPQL 타입 표현과 기타식
  • 조건식 (CASE 등등)
  • JPQL 함수



01. SubQuery

  • 나이가 평균보다 많은 회원

    SELECT m
    FROM Memberm m
    WHERE m.age > (
    	SELECT avg(m2.age)
      FROM Member m2
    )
    
  • 한 건이라도 주문한 고객

SELECT m
FROM Member m
WHERE (
	SELECT count(o)
  FROM Order o
  WHERE m = o.member
) > 0
  • 어떤 팀이든 팀에 소속된 회원
SELECT m
FROM Member m
WHERE m.team = ANY (SELECT t FROM Team t)

02. JPA 서브쿼리 한계

  • JPA는 Where, Having 절에서만 서브 쿼리 가능
  • SELECT 절도 가능 (하이버네이트 지원)
  • FROM 절의 서브 쿼리는 현재 JPQL에서 불가능
    • 조인으로 풀 수 있으면 풀어서 해결

03. JPQL 타입 표현

  • 문자
    • ‘Hello’, ‘She”s’
  • 숫자
    • 10L (Long)
    • 10D (Double)
    • 10F (Float)
  • Boolean
    • TRUE
    • FALSE
  • ENUM
    • jpabook.MemberType.Admin (패키지명 포함)
  • 엔티티 타입
    • TYPE(m) = Member (상속 관계에서 사용)
@Entity
public class Member {
  
  @Id @GeneratedValue
  private Long id;
  private String username;
  private int age;
  
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinCOlumn(name = "TEAM_ID")
  private Team team;
  
  @Enumerated(EnumType.STRING) 
  private MemberType type;  // 이 부분
}


Member member = new Member();
member.setUsername("teamA");
member.setAge(10);
member.setType(MemberType.ADMIN);

// 타입은 패키지명까지 포함해서 조회해야 한다.
String query = "select m.username, 'HELLO', true, from Member m " +
  						"where m.type = jpql.MemberType.ADMIN";

// 파라미터 바인딩으로 동적으로 처리하면 패키지명을 모두 적을 필요가 없다.
String query = "select m.username, 'HELLO', true, from Member m " +
  						"where m.type = :userType";

List<Object[]> result = em.createQuery(query)
  .setParameter("userType", MemberType.ADMIN)
  .getResultList();


댓글남기기