본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
JPA

JPQL - JPQL 기본(7)

by 방구석 대학생 2020. 11. 23.

"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."

www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그

www.inflearn.com

 

 

JPQL 의 타입 표현과 기타 표현식

- 문자 : 'Hello', 'She''s' -> ( ' 기호 자체를 표기해야 할 경우 ' 를 2번 사용해준다.)

- 숫자 : 10L(Long), 10D(Double), 10F(Float)

- Boolean : TRUE, FALSE

- ENUM : jpabook.MemberType.Admin(패키지명 포함)

- Entity 타입 : TYPE(m) = Member(상속 관계에서 사용)

 

아래와 같이 코드를 작성한 후 애플리케이션을 실행해보면 JPQL 에서 표현한 데이터들의 타입에 맞게 출력되는 것을 볼 수 있다.

- JpaMain.java

String query = "select m.username, 'HELLO', TRUE From Member m";
List<Object[]> result = em.createQuery(query)
		.getResultList();

for (Object[] objects : result){
	System.out.println("objects = " + objects[0]);
	System.out.println("objects = " + objects[1]);
	System.out.println("objects = " + objects[2]);
}

- Hibernate SQL

Hibernate: 
    /* select
        m.username,
        'HELLO',
        TRUE 
    From
        Member m */ select
            member0_.username as col_0_0_,
            'HELLO' as col_1_0_,
            1 as col_2_0_ 
        from
            Member member0_
objects = teamA
objects = HELLO
objects = true

 

이번엔 JPQL 에서 ENUM 타입 데이터를 검색해보자.

- MemberType.java

public enum MemberType {
	ADMIN, USER
}

- Member.java

//JPQL 타입 표현과 기타식
@Enumerated(EnumType.STRING)
private MemberType type;
// Getter, Setter

- JpaMain.java

Team team = new Team();
team.setName("teamA");
em.persist(team);

Member member = new Member();
member.setUsername("teamA");
member.setAge(10);
			
// JPQL 타입 표현과 기타식
member.setType(MemberType.ADMIN);
			
member.setTeam(team);

em.persist(member);

em.flush();
em.clear();

// JPQL 타입 표현과 기타식
String query = "select m.username, 'HELLO', TRUE From Member m " +
	"where m.type = jpql.MemberType.ADMIN";
List<Object[]> result = em.createQuery(query)
	.getResultList();

for (Object[] objects : result){
	System.out.println("objects = " + objects[0]);
	System.out.println("objects = " + objects[1]);
	System.out.println("objects = " + objects[2]);
}

 

위와 같이 코드를 작성하고 애플리케이션을 실행해보면 아래와 같은 Hibernate SQL 을 출력하는 것을 볼 수 있다.

- Hibernate SQL

Hibernate: 
    /* select
        m.username,
        'HELLO',
        TRUE 
    From
        Member m 
    where
        m.type = jpql.MemberType.ADMIN */ select
            member0_.username as col_0_0_,
            'HELLO' as col_1_0_,
            1 as col_2_0_ 
        from
            Member member0_ 
        where
            member0_.type='ADMIN' /*where 조건문에 Enum 타입 데이터 검사가 이뤄지고 있다.*/
objects = teamA
objects = HELLO
objects = true

 

 

-  상속관계에 있는 Entity 타입의 데이터를 표현할 경우 아래와 같이 JPQL 을 작성해 줄 수 있다.

- JpaMain.java

em.createQuery("select i from Item i where type(i) = Book ", Item.class)
	.getResultList(); // 클래스 간의 상속관계가 있을 경우의 예시

 

 

 

JPQL 기타 표현식

* SQL 과 문법이 거의 같은 식이다.

* EXISTS, IN, AND, OR, NOT

* =, >, >=, <, <=, <> 과 같은 비교 표현

* BETWEEN, LIKE, IS NULL 또한 사용 가능하다.

 

* JPQL 조건식 - 기본 CASE 식

: 기본 CASE 식은 아래와 같이 작성해 줄 수 있다.

- JpaMain.java

// JPQL 조건식(기본 CASE 식)
String query = "select " +
		"case when m.age <= 10 then '학생요금' " +
		"     when m.age >= 60 then '경로요금' " +
		"     else '일반요금' " +
		"end " +
	        "from Member m";
List<String> result = em.createQuery(query, String.class)
	.getResultList();
for (String s : result){
	System.out.println("s = " + s);
}

- Hibernate SQL

Hibernate: 
    /* select
        case 
            when m.age <= 10 then '학생요금'      
            when m.age >= 60 then '경로요금'      
            else '일반요금' 
        end 
    from
        Member m */ select
            case 
                when member0_.age<=10 then '학생요금' 
                when member0_.age>=60 then '경로요금' 
                else '일반요금' 
            end as col_0_0_ 
        from
            Member member0_
s = 학생요금

 

* 참고로 지금은 JPQL 쿼리를 문자열로 일일히 작성해주느라 오타 및 띄워쓰기 와 같은 에러가 발생하는 것을 조심해야 하지만, 나중에 QueryDSL 같은 것을 사용하게 되면 자바 코드로 편하게 JPQL 쿼리를 작성할 수 있다.

 

위의 기본 CASE 식 말고 단순 CASE 식을 사용하고 싶다면 아래와 같이 작성할 수 있다.

select
	case t.name
	      when '팀A' then '인센티브110%'
	      when '팀B' then '인센티브120%'
	      else '인센티브105%'
	end
from Team t

 

 

다음번 글 에서는 COALESCE, NULLIF, JPQL 기본 함수와 같은 것들을 알아보자.

'JPA' 카테고리의 다른 글

JPQL - JPQL 기본(9)  (0) 2020.11.24
JPQL - JPQL 기본(8)  (0) 2020.11.24
JPQL - JPQL 기본(6)  (0) 2020.11.16
JPQL - JPQL 기본(5)  (0) 2020.11.16
JPQL - JPQL 기본(4)  (0) 2020.11.16