"인프런 - 자바 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 |