[Spring Boot] Querydsl VS JPQL

재피터노트북·2022년 11월 15일
0
post-thumbnail

1. JPQL

JPQL은 JPA의 일부로 Query를 Table이 아닌 객체(=엔티티) 기준으로 작성하는 객체지향 쿼리 언어라고 정의할 수 있다.

JPQL은 객체를 기준으로 모든 것이 움직이기 때문에 개발할 때, Table이 아닌 객체를 대상으로 검색해여 한다.

JPQL 특징
1. SQL을 추상화한 JPA의 객체지향 쿼리
2. Table이 아닌 Entity 객체를 대상으로 개발.
3. Entity와 속성은 대소문자 구분 (PERSON <> person)
4. 별칭(alias) 사용 필수

2. Query DSL

query DSL
정적 타입을 이용해서 SQL, JPQL을 코드로 작성할 수 있도록 도와주는 오픈소스 빌더 API

Query DSL VS JPQL


@SpringBootTest
@Transactional
public class QueryBasicTest {



    @Autowired
    EntityManager em;


    JPAQueryFactory queryFactory;

    @BeforeEach
    public void before() {
        queryFactory = new JPAQueryFactory(em);
        Team teamA = new Team("teamA");
        Team teamB = new Team("teamB");

        em.persist(teamA);
        em.persist(teamB);

        Member member1 = new Member("member1", 10, teamA);
        Member member2 = new Member("member2", 10, teamA);

        Member member3 = new Member("member3", 10, teamB);
        Member member4 = new Member("member4", 10, teamB);
        em.persist(member1);
        em.persist(member2);
        em.persist(member3);
        em.persist(member4);
    }

    @Test
    public void startJPQL() {
        // member1을 찾아라
        Member findByJpql = em.createQuery("select m from Member m where m.username = :username", Member.class)
                .setParameter("username", "member1")
                .getSingleResult();

        Assertions.assertThat(findByJpql.getUsername()).isEqualTo("member1");
    }

    @Test
    public void startQuerydsl() {
        QMember m = new QMember("m");
        Member findMember = queryFactory
                .select(m)
                .from(m)
                .where(m.username.eq("member1"))
                .fetchOne();


        Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");
    }
}

JPQL

  • JPQL: 문자(실행 시점 오류)
  • JPQL: 파라미터 바인딩 직접

Query DSL

  • Querydsl: 코드(컴파일 시점 오류)
  • Querydsl: 파라미터 바인딩 자동 처리
profile
난 이 재 선

0개의 댓글