"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."
www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그
www.inflearn.com
COALESCE, NULLIF
- COALESCE : 데이터를 하나씩 조회해서 null 이 아니면 반환하되, 만약 null 값이 발견될 경우 해당 데이터에 두번째 파라미터를 반환한다.
-> 기본 CASE 식과 단순 CASE 식 같은 것들을 축약한 것이다.
예시 : 사용자 이름이 없으면 이름 없는 회원을 반환한다.
select coalesce(m.username, '이름 없는 회원') from Member m
- JpaMain.java
Member member = new Member();
//member.setUsername("teamA");
member.setUsername(null); // COALESCE 활용
member.setAge(10);
em.persist(member);
em.flush();
em.clear();
// COALESCE 활용
String query = "select coalesce(m.username, '이름 없는 회원') from Member m";
// Member 객체에 삽입된 데이터의 회원 이름 값을 null 로 바꾼 후 실행해보자.
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result){
System.out.println("s = " + s);
}
- Hibernate SQL
Hibernate:
/* select
coalesce(m.username,
'이름 없는 회원')
from
Member m */ select
coalesce(member0_.username,
'이름 없는 회원') as col_0_0_
from
Member member0_
s = 이름 없는 회원
- NULLIF : 두 값이 같으면 null 을 반환하고, 다르면 첫번째 값을 반환한다.
-> 예시 : 사용자 이름이 '관리자' 이면 null 을 반환하고, 나머지는 본인의 이름을 반환한다.
select NULLIF(m.username, '관리자') from Member m
- JpaMain.java
Member member = new Member();
//member.setUsername("teamA");
//member.setUsername(null); // COALESCE 활용
member.setUsername("관리자"); // NULLIF 활용
member.setAge(10);
em.persist(member);
em.flush();
em.clear();
// NULLIF 활용
String query = "select NULLIF(m.username, '관리자') from Member m";
// Member 객체에 삽입된 데이터의 회원 이름 값을 '관리자' 로 바꾼 후 실행해보자.
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result){
System.out.println("s = " + s);
}
- Hibernate SQL
Hibernate:
/* select
NULLIF(m.username,
'관리자')
from
Member m */ select
nullif(member0_.username,
'관리자') as col_0_0_
from
Member member0_
s = null
* 참고 : COALESCE, NULLIF 와 같은 함수들은 JPA 에서 제공하는 표준 함수이기 때문에 어떤 DB 에서든지 모두 사용 가능하다.
JPQL 기본 함수
1. CONCAT, 2. SUBSTRING, 3. TRIM, 4. LOWER, UPPER, 5. LENGTH, 6. LOCATE, 7. ABS, SQRT, MOD,
8. SIZE, INDEX(JPA 용도)
아래의 사이트를 방문하면 각 함수들의 자세한 사용법을 알아볼 수 있다.
www.objectdb.com/java/jpa/query/jpql/string
1. CONCAT
Hibernate 에서는 문자를 합칠 때 || 키워드 또한 제공하고 있는데, 해당 키워드를 이용해서 그냥 코드를 작성할 경우 || 에서 에러가 발생한다.
이를 고치려면 IntelliJ IDE 에서 제공하는 기능인 UnInject Language/Reference 기능을 활용하면 된다.
* UnInject Language/Reference : 현재 에디터에 주입되어 있는 언어 및 참조를 해제한다.
- JpaMain.java
String query = "select 'a' || 'b' FROM Member m";
//String query = "select concat('a', 'b') 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
'a' || 'b'
FROM
Member m */ select
('a'||'b') as col_0_0_
from
Member member0_
s = ab
2. SUBSTRING
String 클래스의 substring 메소드와 같이 전체 문자열에서 지정한 범위내에 있는 일부 문자열을 잘라내어 새로운 문자열을 만든다.
- JpaMain.java
String query = "select substring(m.username, 2, 3) 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
substring(m.username,
2,
3)
From
Member m */ select
substring(member0_.username,
2,
3) as col_0_0_
from
Member member0_
s = 리자
3. TRIM
SUBSTRING 과 같이 문자열의 일부를 잘라내는 함수이다.
기본 값은 문자열에 있는 공백들을 모두 지우는 것이나, LEADING FROM, TRAILING FROM 과 같은 키워드를 통해 문자열을 자르는 기준을 바꿔줄 수 있다.
예시 :
- TRIM(' UK ') -> 'UK'. // 문자열의 모든 공백을 잘라낸다.
- TRIM(LEADING FROM ' UK ') -> 'UK '. // LEADING FROM : 문자열에서 가장 먼저 발견되는 공백을 잘라낸다.
- TRIM(TRAILING FROM ' UK ') -> ' UK'. // TRAILING FROM : 문자열에서 가장 뒤에 발견되는 공백을 잘라낸다.
- TRIM('A' FROM 'ARGENTINA') -> 'RGENTIN. // FROM 키워드를 통해 특정 글자를 기준으로 지정해주면 전체 문자열에서 지정된 문자만을 잘라낸다
- TRIM(LEADING 'A' FROM 'ARGENTINA') -> 'RGENTINA'. // 전체 문자열에서 가장 앞에 있는 지정한 문자를 잘라낸다.
- TRIM(TRAILING 'A' FROM 'ARGENTINA') -> 'ARGENTIN'. // 전체 문자열에서 가장 뒤에 있는 지정한 문자를 잘라낸다.
다음 번 글에서는 4. LOWER, UPPER 함수부터 알아보자.
'JPA' 카테고리의 다른 글
JPQL - JPQL 기본(10) (0) | 2020.11.24 |
---|---|
JPQL - JPQL 기본(9) (0) | 2020.11.24 |
JPQL - JPQL 기본(7) (0) | 2020.11.23 |
JPQL - JPQL 기본(6) (0) | 2020.11.16 |
JPQL - JPQL 기본(5) (0) | 2020.11.16 |