QueryDSL
QueryDSL은 JPAQueryFactory가 필요하다
JPAQueryFactory는 생성자로 EntityManager가 필요하다
public class QueryDsl {
@Autowired
EntityManager entityManager;
JPAQueryFactory jpaQueryFactory;
public void method() {
jpaQueryFactory = new JpaQueryFactory(entityManager);
}
}
이런 식으로 받아주면 된다.
JpaQueryFactory 기본 문법은 SQL 문법이랑 매우 비슷하다.
기본 문법
select()
SQL의 SELECT다
SELECT * FROM users
# 여기서 SELECT. 매개 변수로 컬럼을 넣어주면 된다
from()
SQL의 FROM
SELECT * FROM users
# 여기서 FROM. 매개변수로 테이블을 넣어주면 된다
selectFrom()
SELECT * FROM users
# 여기서 SELECT 및 FROM
# 매개변수로 users를 넣어주면 위와 같은 SQL이 작성된다
where()
SQL의 WHELE 조건절
SELECT * FROM users WHERE USERNAME = 'WONOW'
# jpaQueryFactory.selectFrom(users).where.(users.username.eq("WONOW"));
매개변수 안에 조건 메서드를 넣어주면 된다
저 eq는 equals
진짜... 대박 잘만들었다 DSL
Fetch 메서드
fetch()
List 형식으로 반환
@Override
@SuppressWarnings("unchecked")
public List<T> fetch() {
try {
Query query = createQuery();
return (List<T>) getResultList(query);
} finally {
reset();
}
}
메서드를 들어가서 보면 이렇다
내부적으로 JPQL을 쓰는 것이다. 진짜 대박인데... DSL
fetchOne()
@Nullable
@SuppressWarnings("unchecked")
@Override
public T fetchOne() throws NonUniqueResultException {
try {
Query query = createQuery(getMetadata().getModifiers(), false);
return (T) getSingleResult(query);
} catch (javax.persistence.NoResultException e) {
logger.log(Level.FINEST, e.getMessage(), e);
return null;
} catch (javax.persistence.NonUniqueResultException e) {
throw new NonUniqueResultException(e);
} finally {
reset();
}
}
결과 하나를 제네릭 타입으로 반환한다.
결과가 여러개면 NonUniqueResultException이 발생한다
그리고 결과가 없으면 null을 반환한다.
fetchFirst()
결과에 Limit 1을 걸어서 반환한다
SELECT * FROM users LIMIT 1
진짜 보면 볼 수록 잘 만들었다... 다음 글은 Q타입에 대한 설명을 적을 것이다
'TIL' 카테고리의 다른 글
TIL 2023-12-19 @WebMvcTest 와 Application JPAQueryFactory Bean 등록 오류 (2) | 2023.12.19 |
---|---|
TIL 2023-12-18 QueryDSL Qclass 살펴보기... 삽질 (0) | 2023.12.18 |
TIL 2023-12-14 정적쿼리 동적쿼리 그리고 QueryDSL 약간 (0) | 2023.12.14 |
TIL 2023-12-13 AOP Logging 구현 (0) | 2023.12.13 |
TIL 2023-12-12 왜 Service를 인터페이스와 구현체로 나눌까? (0) | 2023.12.12 |