티스토리 뷰
JPQL 기본 함수
• CONCAT
• SUBSTRING
• TRIM
• LOWER, UPPER
• LENGTH
• LOCATE
• ABS, SQRT, MOD
• SIZE, INDEX(JPA 용도)
GPT를 통한 설명
CONCAT: 문자열을 연결하는 함수입니다.
예를 들어, CONCAT('Hello', ' ', 'World')는 "Hello World"를 반환합니다.
SUBSTRING: 문자열의 일부를 추출하는 함수입니다.
SUBSTRING(expression, start, length) 형식으로 사용됩니다.
expression은 대상 문자열이고, start는 추출을 시작할 위치를 나타내며, length는 추출할 문자의 수를 나타냅니다.
TRIM: 문자열의 앞뒤 공백을 제거하는 함수입니다.
TRIM([LEADING | TRAILING | BOTH] trim_character FROM expression) 형식으로 사용됩니다.
trim_character는 생략할 수 있으며, 기본값으로 공백이 사용됩니다.
LOWER, UPPER: 문자열을 소문자 또는 대문자로 변환하는 함수입니다.
LOWER(expression)는 문자열을 소문자로 변환하고, UPPER(expression)는 문자열을 대문자로 변환합니다.
LENGTH: 문자열의 길이를 반환하는 함수입니다.
LENGTH(expression) 형식으로 사용됩니다.
LOCATE: 문자열 내에서 다른 문자열의 위치를 찾는 함수입니다.
LOCATE(search_string, expression, [start_position]) 형식으로 사용됩니다.
search_string은 찾을 문자열이고, expression은 대상 문자열입니다.
start_position은 검색을 시작할 위치를 나타내며 생략 가능합니다.
ABS, SQRT, MOD: 수치 연산 함수입니다.
ABS(expression): 절댓값을 반환합니다.
SQRT(expression): 제곱근을 반환합니다.
MOD(expression1, expression2): 나머지를 반환합니다.
SIZE, INDEX: JPA에서 사용되는 특수 함수입니다.
SIZE(collection_expression): 컬렉션의 크기를 반환합니다.
INDEX(expression): 컬렉션의 특정 요소의 인덱스를 반환합니다.
예시
1. CONCAT()
JpqlMain
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 팀 먼저 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("관리자1");
member.setAge(10);
em.persist(member);
member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.
em.flush();
em.clear(); // 비움
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);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
2. SUBSTRING()
예제
JpaMain
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 팀 먼저 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("즐라탄이브라히모비치"); // 요기
member.setAge(10);
em.persist(member);
member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.
em.flush();
em.clear(); // 비움
String query = "select substring(m.username, 2, 4) from Member m"; // 요기
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result) {
System.out.println("s = " + s);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
6. LOCATE()
JpqlMain
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 팀 먼저 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("서울특별시 강남구 신사동");
member.setAge(10);
em.persist(member);
member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.
em.flush();
em.clear(); // 비움
String query = "select locate('de', 'abcdefg') from Member m";
List<Integer> result = em.createQuery(query, Integer.class)
.getResultList();
for (Integer i : result) {
System.out.println("i = " + i);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
8. SIZE()
JpqlMain
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 팀 먼저 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("서울특별시 강남구 신사동");
member.setAge(10);
em.persist(member);
member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.
em.flush();
em.clear(); // 비움
String query = "select size(t.members) from Team t";
List<Integer> result = em.createQuery(query, Integer.class)
.getResultList();
for (Integer s : result) {
System.out.println("s = " + s);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
인덱스는 @OrderColumn 을 쓸 때 쓴다. 웬만하면 쓰지 말라.
사용자 정의 함수
예시
좀 복잡한데,
MyH2Dialect 라는 클래스를 만들어서 구현한다.
package inflearnjpa.dialect;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;
public class MyH2Dialect extends H2Dialect {
public MyH2Dialect() {
registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
}
}
그리고
persistance.xml에
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>-->
<property name="hibernate.dialect" value="inflearnjpa.dialect.MyH2Dialect"/>
이렇게 바꿔준다.
그리고 나서
JpqlMain에 코드
public class JpqlMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member1 = new Member();
member1.setUsername("관리자 1");
em.persist(member1);
Member member2 = new Member();
member2.setUsername("관리자 2");
em.persist(member2);
em.flush();
em.clear(); // 비움
String query = "select function('group_concat', m.username) from Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
for (String s : result) {
System.out.println("s = " + s);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
이것도 좀 많이 바꿈...
실행 결과를 살펴보면
한 줄로 늘려서 출력해줌.
여기까지.
기본 문법 끝!
'[데이터베이스] > JPQL' 카테고리의 다른 글
fetch join (페치 조인) (1) 기본 (0) | 2023.09.02 |
---|---|
경로 표현식 (0) | 2023.09.01 |
조건식 (0) | 2023.08.31 |
JPQL 타입 표현 (0) | 2023.08.31 |
서브 쿼리 (0) | 2023.08.31 |