코드 그라데이션

JPQL 함수들 본문

Database/JPQL

JPQL 함수들

완벽한 장면 2023. 9. 1. 00:16

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();
  }
}

이것도 좀 많이 바꿈...

 

실행 결과를 살펴보면

한 줄로 늘려서 출력해줌.

 

 

여기까지. 

기본 문법 끝!

728x90

'Database > 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
Comments