본문 바로가기
BackEnd

[JPA] JPQL 연산자와 함수

by mizuiro 2024. 7. 25.

연산자 함수

SQL은 각 데이터베이스에서 제공하는 연산자나 함수가 조금씩 다르다는 것때문에 쿼리 문을 공유할 수 없다

그러나 JPQL에서는 특정 데이터베이스에 종속되지 않는 연산자와 함수를 지원하기에 여러 데이터베이스에서 사용이 가능하다

또한 JPA에서는 엔터티를 사용해서 데이터를 저장하고 있기에 컬렉션을 사용하여 값이 존재하는지 아닌지 empty, member 연산자로 할 수 있다

  1. is empty 연산자

실행 코드

String jpql = "SELECT d FROM Department d " + 
                   "WHERE d.employeeList is empty";
        TypedQuery<Department> query = em.createQuery(jpql, Department.class);

        List<Department> resultList = query.getResultList();
        System.out.println("직원이 없는 부서 목록");
        for (Department department : resultList) {
            System.out.println(department.getName());
        }

결과

Hibernate: 
    select
        department0_.DEPT_ID as dept_id1_0_,
        department0_.name as name2_0_ 
    from
        S_DEPT department0_ 
    where
        not (exists (select
            employeeli1_.id 
        from
            S_EMP employeeli1_ 
        where
            department0_.DEPT_ID=employeeli1_.DEPT_ID))
직원이 없는 부서 목록
인재개발부

JPQL 의 쿼리문에서는 exists를 사용하지 않았지만 empty 연산자를 사용해서 부서가 존재 하는지를 조건을 걸었으므로, 이 조건을 수행하기 위해 JPA에서 자동으로 서브쿼리를 사용해 조건에 맞는 데이터를 검색한다

  1. member of

실행 코드

String jpql = "SELECT d FROM Department d " + 
                   "WHERE :employee member of d.employeeList";
        TypedQuery<Department> query = em.createQuery(jpql, Department.class);

        // 6번 직원 객체를 검색하여 파라미터로 설정한다.
        EmployeeJoin findEmp = em.find(EmployeeJoin.class, 6L);
        query.setParameter("employee", findEmp);

        List<Department> resultList = query.getResultList();
        System.out.println(findEmp.getId() + "번 직원이 소속되어있는 부서 목록");
        for (Department department : resultList) {
            System.out.println(department.getName());
        }        

결과

Hibernate: 
    select
        employeejo0_.id as id1_1_0_,
        employeejo0_.COMMISSION_PCT as commissi2_1_0_,
        employeejo0_.DEPT_ID as dept_id9_1_0_,
        employeejo0_.DEPT_NAME as dept_nam3_1_0_,
        employeejo0_.MAIL_ID as mail_id4_1_0_,
        employeejo0_.name as name5_1_0_,
        employeejo0_.salary as salary6_1_0_,
        employeejo0_.START_DATE as start_da7_1_0_,
        employeejo0_.title as title8_1_0_,
        department1_.DEPT_ID as dept_id1_0_1_,
        department1_.name as name2_0_1_ 
    from
        S_EMP employeejo0_ 
    left outer join
        S_DEPT department1_ 
            on employeejo0_.DEPT_ID=department1_.DEPT_ID 
    where
        employeejo0_.id=?
Hibernate: 
    select
        department0_.DEPT_ID as dept_id1_0_,
        department0_.name as name2_0_ 
    from
        S_DEPT department0_ 
    where
        ? in (
            select
                employeeli1_.id 
            from
                S_EMP employeeli1_ 
            where
                department0_.DEPT_ID=employeeli1_.DEPT_ID
        )
6번 직원이 소속되어있는 부서 목록
영업부

함수 사용하기

종류

  • 문자형
  • 숫자형
  • 날짜형

'BackEnd' 카테고리의 다른 글

[JPA] Spring과 JPA-2  (0) 2024.07.30
[JPA] Spring과 JPA-1  (0) 2024.07.29
[JPA] groupping과 subquery  (0) 2024.07.24
[JPA] JPQL  (0) 2024.07.22
[JPA] 연관관계 매핑( 다대다)  (0) 2024.07.18