728x90
반응형
JPQL의 기본함수 종류
기존함수는 SQL과 동일하기 때문에 몇몇부분은 생략했습니다.
- CONCAT
- SUBSTRING
- TRIM
- LOWER, UPPER
- LENGTH
- LOCATE
- ABS, SQRT, MOD
- SIZE, INDEX(JPA 용도)
CONCAT
- 두개의 문자를 합친다.
예제
// CONCAT 예제
String concatQuery = "select concat('a', 'b') as username from JPQLMember m";
List<String> concatResult = em.createQuery(concatQuery, String.class).getResultList();
for(String s : concatResult) {
System.out.println("s = "+s);
}
결과
Hibernate:
/* select
concat('a',
'b') as username
from
JPQLMember m */ select
('a'||'b') as col_0_0_
from
JPQLMember jpqlmember0_
s = ab
SUBSTRING
- 주어진 위치에서 원하는 숫자 만큼 문자열을 뽑는다.
예제
// SUBSTRING 예제
String subStringQuery = "select substring(m.username, 2,3) as username from JPQLMember m";
List<String> subStringResult = em.createQuery(subStringQuery, String.class).getResultList();
for(String s : subStringResult) {
System.out.println("s = "+s);
}
결과
member 에서 2번째 위치부터 3개의 문자까지 가져온다.
Hibernate:
/* select
substring(m.username,
2,
3) as username
from
JPQLMember m */ select
substring(jpqlmember0_.USER_NAME,
2,
3) as col_0_0_
from
JPQLMember jpqlmember0_
s = emb
LOCATE
- 문자열의 위치를 반환한다.
// locate 예제
String locateQuery = "select locate('de','abcde') as username from JPQLMember m";
List<Integer> locateResult = em.createQuery(locateQuery, Integer.class).getResultList();
for(Integer s : locateResult) {
System.out.println("s = "+s);
}
결과
Hibernate:
/* select
locate('de',
'abcde') as username
from
JPQLMember m */ select
locate('de',
'abcde') as col_0_0_
from
JPQLMember jpqlmember0_
s = 4
SIZE
- 컬렉션 안에 들어 있는 아이템수를 카운트한다.
예제
// SIZE
String sizeQuery = "select size(m.members) from JPQLTeam m";
List<Integer> sizeResult = em.createQuery(sizeQuery, Integer.class).getResultList();
for(Integer s : sizeResult) {
System.out.println("s = "+s);
}
결과
- 현재 members 의 list 에 3개가 들어 있다.
Hibernate:
/* select
size(m.members)
from
JPQLTeam m */ select
count(members1_.TEAM_ID) as col_0_0_
from
JPQLTeam jpqlteam0_ cross
join
JPQLMember members1_
where
jpqlteam0_.TEAM_ID=members1_.TEAM_ID
s = 3
사용자 정의 함수 호출
- 직접 함수를 정의할수 있다.
- dialect 를 상속받아야 한다.
- persistence.xml에 상속받은 dialect 를 등록해줘야한다.
예제
이번예제에서는 group_concat 을 직접 등록해서 사용해본다.
MyH2Dialect class
package jpql.dialect;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;
// 사용하는 Dialect를 상속받는다.
public class MyH2Dialect extends H2Dialect {
public MyH2Dialect() {
registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
}
}
persistence.xml
- 기존 <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 를 주석처리후
- 새로만든 dialect 를 등록해줬다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
...
...
...
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> -->
<property name="hibernate.dialect" value="jpql.dialect.MyH2Dialect"/>
...
...
...
</properties>
</persistence-unit>
</persistence>
참고:
https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21726?tab=curriculum
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[JPA] JPQL Fetch Join (0) | 2021.09.26 |
---|---|
[JPA] JPQL 경로표현식 (0) | 2021.09.26 |
[JPA] JPQL CASE (0) | 2021.09.25 |
[JPA] JPQL TYPE (0) | 2021.09.24 |
[JPA] JPQL 조인, 서브쿼리 (0) | 2021.09.24 |
댓글