타입 세이프한 방식으로 동적 쿼리를 작성할 수 있도록 도와주는 라이브러리
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
@Configuration
public class QuerydslConfig {
@PersistenceContext
private EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em);
}
}
queryFactory
.select(조회대상)
.from(대상엔티티)
.where(조건)
.orderBy(정렬)
.fetch();
eq() : 같다ne() : 다르다gt() : 초과goe() : 이상contains() : 포함endsWith() : 끝남BooleanBuilder builder = new BooleanBuilder();
if (username != null) {
builder.and(user.username.contains(username));
}
if (email != null) {
builder.and(user.email.contains(email));
}
if (role != null) {
builder.and(user.roleEnum.eq(role));
}
List<User> result = queryFactory
.selectFrom(user)
.where(builder)
.fetch();
private BooleanExpression usernameContains(String username) {
return username != null ? user.username.contains(username) : null;
}
private BooleanExpression emailContains(String email) {
return email != null ? user.email.contains(email) : null;
}
private BooleanExpression roleEq(UserRoleEnum role) {
return role != null ? user.roleEnum.eq(role) : null;
}
List<User> result = queryFactory
.selectFrom(user)
.where(
usernameContains(cond.getUsername()),
emailContains(cond.getEmail()),
roleEq(cond.getRole())
)
.fetch();
@Entity
public class Post {
@ManyToOne(fetch = FetchType.LAZY)
private User user;
}
@Entity
public class Post {
private Long userId; // 연관관계 대신 ID만 저장
}
List<PostResponse> result = queryFactory
.select(Projections.constructor(PostResponse.class,
post.content,
user.username))
.from(post)
.leftJoin(user).on(post.userId.eq(user.id)) // ID 기반 Join
.fetch();