728x90
반응형
JPQL은 웬만한 DBMS가 제공하는 기본적인 함수들을 제공하고 있다.
함수명 | 용도 |
CONCAT | 문자열 이어 붙이기 |
SUBSTRING | 부분 문자열 만들기 |
TRIM | 빈 공백 없애기 |
LOWER, UPPER | 소문자, 대문자 |
LENGTH | 문자열의 길이 |
LOCATE | 문자열의 위치(Integer 값) |
ABS, SQRT, MOD | 절대값, 제곱근, 나누기 |
SIZE, INDEX(JPA 용도) | 컬렉션(또는 엔티티)의 전체 크기, 컬렉션의 위치 |
예시) CONCAT
String jpql = "";
// uninject language를 적용하면 된다. 방법 : 해당 문자열 내에서 ALT + ENTER 누르면 안내문이 나옴
jpql = "select 'a' || 'b' From Member m";
List<String> resultList = em.createQuery(jpql, String.class)
.getResultList();
for(String s : resultList) {
System.out.println("s = " + s);
}
jpql = "select concat('a', 'b') from Member m";
예시) SUBSTRING
jpql = "select substring(m.username, 2, 3) from Member m";
예시) LOCATE : 위치값을 반환하기 때문에 Integer.class
jpql = "select locate('de', 'abcdefg') from Member m";
List<Integer> resultList = em.createQuery(jpql, Integer.class)
.getResultList();
for(Integer s : resultList) {
System.out.println("s = " + s);
}
예시) SIZE : 정수값 반환이라 Integer.class
// ALT + ENTER 눌러서 uninject language 에 대한 설정이 가능하다
jpql = "select size(t.members) from Team t";
List<Integer> resultList = em.createQuery(jpql, Integer.class)
.getResultList();
for(Integer s : resultList) {
System.out.println("s = " + s);
}
예시) INDEX : 일반적으로 사용할 수 있는건 아닌데, 사용을 추천하지 않는다.
리스트의 값 타입을 넣어서 사용할 때 쓴다.
리스트에서 중간에 값이 빠질 때 Null 로 데이터가 들어온다.
사용자 정의 함수를 호출하는 방법이 있다.
하이버네이트에는 사용자 정의 함수 호출을 사용하기 전에, persistence.xml에 등록해주는 과정이 필요하다.
dialect 패키지 밑에 MyH2Dialect.java 를 생성해준다.
package 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));
}
}
persistence.xml
<?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="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpaStudy2"/>
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>-->
<property name="hibernate.dialect" value="dialect.MyH2Dialect"/>
<!--<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>-->
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.jdbc.batch_size" value="10"/>
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
기존에 활성화 되어있었던 H2Dialect 를 비활성화해주고, 새롭게 추가한 MyH2Dialect 를 추가한다.
그러면 이제 사용자 정의 함수를 사용할 준비가 되었다.
JpaMain.java
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setUsername("관리자");
member.setAge(10);
member.setTeam(team);
member.setType(MemberType.ADMIN);
em.persist(member);
Member member2 = new Member();
member2.setUsername("회원");
member2.setAge(20);
member2.setTeam(team);
member2.setType(MemberType.USER);
em.persist(member2);
em.flush();
em.clear();
String jpql = "";
jpql = "select function('group_concat', m.username) from Member m";
List<String> resultList = em.createQuery(jpql, String.class)
.getResultList();
for(String s : resultList) {
System.out.println("s = " + s);
}
이렇게 하면 사용자 정의 함수를 호출할 수 있다.
728x90
반응형
'자바 > JPA' 카테고리의 다른 글
[JPA/Java] JPQL fetch join (패치 조인) (2) | 2023.05.10 |
---|---|
[JPA/Java] JPQL 경로 표현식 (0) | 2023.05.10 |
[JPA/Java] JPQL CASE 문, COALESCE, NULLIF (0) | 2023.05.09 |
[JPA/Java] JPQL 타입 표현과 기타식 (0) | 2023.05.09 |
[JPA/Java] JPQL 서브쿼리 (0) | 2023.05.09 |
댓글