QueryDSL과 SQL

두주·2024년 1월 31일
0

TIL

목록 보기
44/58

QueryDSL의 목적은 JPQL 생성이다.

  • QueryDSL은 쿼리 생성에 특화된 프레임워크로, JPA 프레임워크와 분리되어 있다.
  • QueryDSL은 Entity 정보를 담은 Q타입 클래스를 사용한다.

Q-Type Class

QType class는 QueryDSL 설정이 성공적으로 진행되면,
@Entity가 붙은 클래스를 찾아서 자동으로 생성된다.
QueryDSL을 사용해 method 기반으로 쿼리를 작성할 때,
우리가 만든 도메인 클래스(Entity Class)를 설명해주는 메타 데이터 역할을
맡으며, 쿼리의 조건을 설정할 때 사용된다.

QueryDSL

val post=QPost.post // 기본 instance
val post=QPost("p") // 별칭 지정

SQL

메인 명령어

INSERT - INTO

  • Create
    SELECT - FROM
  • Get
    queryFactory
    .selectFrom(post)
    .fetch()
    -> SELECT * FROM POST
    queryFactory
    .select(post.title)
    .from(post)
    .fetch()
    -> SELECT title FROM POST

UPDATE - SET

  • Update
    DELETE - FROM
  • Delete

보조 명령어

WHERE

  • JPA의 findByIdOrNull 등이 해당된다고 볼 수 있다.
    queryFactory.select(post)
    .from(post)
    .where(post.title.eq("제목"))
    .fetch()
    -> SELECT * FROM POST
    WHERE title="제목"

특정 조건을 찾기 위해 사용됨.
eq = equal ("=")

ORDER BY

  • 정렬 시 사용됨
    queryFactory.select(post)
    .from(post)
    .where(post.title.eq("제목"))
    .orderBy(post.numLike)
    .fetch()
    -> SELECT * FROM POST
    WHERE title="제목"
    ORDER BY numLike

numLike가 많은 순서로 "정렬"한다.

.orderBy(post.numLike.asc) -> 오름차순
.orderBy(post.numLike.desc) -> 내림차순

QueryDSL에서도 asc와 desc를 표현할 수 있다.

GROUP BY
AND/OR
JOIN

  • 가장 중요함
  • JOIN은 아래 그림과 같이 두 테이블을 하나의 테이블로 합치는 기능이다.

Join

Inner Join (교집합)

Left Join (왼쪽 + 교집합)

응시자 중 박씨면서 70점 이상인 사람의 수는 ?

SQL에서는 이렇게 쓸 수 있고

SELECT * FROM A
INNER JOIN B ON A.id=B.id --(A의 id와 B의id가 같음 (외래키))
WHERE
A.name like "박%"
AND
B.score > 70

QueryDSL에서는 이렇게 쓸 수 있다.

queryFactory.selectfrom(a)
	.innerjoin(a.id, b) // 명확히는 innerJoin(a).on(b.id.eq(a.id))
	.where(a.name.like("박%"))
		.and(b.score.gt(70))
	.fetch()

Left Join을 사용할 때에는 null에 주의해야 한다

profile
야옹.

0개의 댓글