지나공 : 지식을 나누는 공간

JPA 8 -3 : JPQL 타입 표현과 기타식, JPQL 기본 함수 본문

Tech/JPA

JPA 8 -3 : JPQL 타입 표현과 기타식, JPQL 기본 함수

해리리_ 2020. 12. 20. 20:32

JPQL 타입 표현

  • 문자 : 'HI', 'He''s' -> ' '안에 (')을 넣어야 할 때는 작은 따옴표 두 개 사용해서 표현
  • 숫자 : 10L(Long), 10D(Double), 10F(Float)
  • Boolean : true, false
  • enum : 패키지명을 모두 포함해서 적어야 함.
public enum MemberType{
 ADMIN, USER;
}
public class Member{

	@Enumerated(EnumType.STRING)
	private MemberType type;
    //기본이 EnumType.ORDINAL이므로 항상 STRING으로 변경해주어야 함
}
String query = "select m.username from Member m " +
			"where m.type = jpql.MemberType.ADMIN";

jpql.MemberType.ADMIN 처럼 enum의 패키지명을 적어야 한다.

 

  • 엔티티타입 : Type(m) = Member (상속 관계에서 사용)

SQL 과 문법이 같은 식

  • EXISTS, IN
  • AND, OR, NOT
  • =, >, >= , like between 등 모두 가능

조건식 - CASE 식

String query = 
"select
	case when m.age <= 10 then '학생요금'
    	 when m.age >= 60 then '경로요금'
         else '일반요금'
    end
from Member m";
List<String> result = em.createQuery(query, String.class).getResultList();

 

  • COALESCE : 하나씩 조회하다가 NULL이 아니면 반환
  • NULLIF : 두 값이 같으면 NULL 반환, 다르면 첫째 값 반환
SELECT COALESCE(m.username, '이름 없는 회원') from Member m

select NULLIF(m.username, '관리자') from Member m

 

JPQL 기본 함수 - 데이터베이스에 관계없이 사용 가능

 

  • CONCAT (문자 더하기) select 'a' || 'b' from Member m 또는 concat('a','b')
  • SUBSTRING (문자를 잘라내기)
  • TRIM (공백제거)
  • LOWER
  • UPPER
  • LENGTH
  • LOCATE : loacate('de', 'abcdef')는 4 반환 (1부터 시작)
  • ABS, SQRT, MOD
  • SIZE, INDEX(JPA 용도) : select size(t.members) from Team t 는 t의 멤버 수 반환
    • index는 값 타입에서 컬렉션의 위치 값 구할 때 쓰는 건데 안 쓰는 게 좋다.

사용자 정의 함수 호출

위의 기본함수를 사용할 수 없을 때 사용자 정의 함수를 호출한다. 사용하는 DB 방언을 상속받고 사용자 정의 함수를 등록할 수 있다. MysqlDialect class를 보면 registerFunction으로 미리 등록된 것들이 있는데 이런 건 그냥 쓰면 된다. 하지만 없는 부분들은 아래처럼 등록해야 한다.

 

public class MyH2Dialect extends H2Dialect {
	public MyH2Dialect(){
    	registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
    }
}


String query = "select function("group_concat", m.username) from Member m;
List<String> result = em.createQuery(query, Integer.class).getResultList();
//관리자1, 관리자 2 라는 하나의 String으로 반환됨

 

728x90
Comments