querydsl 자체는 jpa 에서 query 를 만들때 만들수 없는 부분을 부가적으로 만들수 있는 장점이 있다.
전 포스트에서 querydsl 설정을 했다면 아마 구동하는데 있어서 문제는 없을 것이다.
보통 CRUD 라고 표현을 하지만 querydsl 을 사용을 했봤는데 ...
insert / create 관련된 문서가 없었다 ... 그래서 포스팅에서도 C 를 뻇다...
complieQuerydsl
이라는 것을 실행을 시키면 아래와 같이 build 안에 qclass 가 생성이 된다.
Support Class 이다.
QuerydslRepositorySupport
을 주입해야 사용이 가능하다
아래 전역 변수로JPAQueryFactory
,EntityManager
을 추가 해준다.
supper 에 지정된 도메인을 넣어준다. 그러면 이 클래스에서는 주입 받은 도메인이 메인이 된다.
@Repository
public class AppUserRepositorySupport extends QuerydslRepositorySupport {
private final JPAQueryFactory jpaQueryFactory;
private final EntityManager entityManager;
public AppUserRepositorySupport(JPAQueryFactory jpaQueryFactory, EntityManager entityManager) {
super(AppUser.class);
this.jpaQueryFactory = jpaQueryFactory;
this.entityManager = entityManager;
}
}
가장 기본적인 쿼리
select from 절
을 querydsl 을 사용을 하여서 만드는 방법이다.
주입 받은JPAQueryFactory
을 가지고 selectFrom 이라는 메소드를 이용하여서
데이터를 가지고 올 수 가 있다.
@Transactional(readOnly = true)
public List<AppUser> findByAll() {
return jpaQueryFactory.selectFrom(appUser).fetch();
}
update 절의 경우 update 라는
QuerydslRepositorySupport
에 내장되어 있는 메소드를 사용을 한다.
updateclause
에서set
메소드가 내장되어있다.
set 의 경우 도메인에 컬럼 그리고 바꿀 데이터 이렇게 인자를 받는다.
조건절
을 이용하여서 아래와 같이 dynamic 하게 받을 수 있다.
@Transactional
이 어노테이션은 꼭 사용하자 이 부분에은 따로 포스팅하여서 다룰 예정이다.
@Transactional
public Long update(AppUserDTO dto, Long id) {
UpdateClause<JPAUpdateClause> updateBuilder = update(appUser);
if (StringUtils.isNoneEmpty(dto.getFirstName())) {
updateBuilder.set(appUser.firstName, dto.getFirstName());
}
if (StringUtils.isNoneEmpty(dto.getLastName())) {
updateBuilder.set(appUser.lastName, dto.getLastName());
}
if (StringUtils.isNoneEmpty(dto.getEmail())) {
updateBuilder.set(appUser.email, dto.getEmail());
}
if (StringUtils.isNoneEmpty(dto.getGender())) {
updateBuilder.set(appUser.gender, dto.getGender());
}
if (ObjectUtils.isNotEmpty(dto.getCount())) {
updateBuilder.set(appUser.count, dto.getCount());
}
return updateBuilder
.where(appUser.id.eq(id))
.execute();
}
delete 메소드의 경우에도 마찬가지이다.
QuerydslRepositorySupport
에 내장되어 있는 메소드를 이용하여서 사용을 한다
update 절과 마찬가지이다@Transactional
어노테이션을 사용을 해야 쿼리가 실행을 된다.
@Transactional
public Long delete(Long id) {
return delete(appUser).where(appUser.id.eq(id)).execute();
}
단순 select 절을 이용하면서 where 절을 사용을 하고 싶었다.
mybatis 의 경우 if 가 있어서 dynamic 하게 사용이 가능하다.
querydsl 에서도 가능하다. 위의 update 절과 유사하다 단지 builder 가 다를 뿐이다.
아래의 코드를 보면BooleanBuilder
을 이용을 한다.
boolean builder 의 경우 querydsl 에서 core 패키지에 내장이 되어있다.
and , or 절도 만들 수 있다.
필요에 따라 적절하게 사용을 하면될거 같다.
아래와 같이 전역적으로 메소드로 뺴서 사용하면 delete , update 에서도 사용이 가능하다.
private BooleanBuilder setWhereBuilder(AppUserDTO dto) {
BooleanBuilder booleanBuilder = new BooleanBuilder();
if (StringUtils.isNotEmpty(dto.getFirstName())) {
booleanBuilder.and(appUser.firstName.eq(dto.getFirstName()));
}
if (StringUtils.isNoneEmpty(dto.getLastName())) {
booleanBuilder.and(appUser.lastName.eq(dto.getLastName()));
}
if (StringUtils.isNoneEmpty(dto.getEmail())) {
booleanBuilder.and(appUser.email.eq(dto.getEmail()));
}
if (StringUtils.isNoneEmpty(dto.getGender())) {
booleanBuilder.and(appUser.gender.eq(dto.getGender()));
}
if (ObjectUtils.isNotEmpty(dto.getCount())) {
booleanBuilder.and(appUser.count.eq(dto.getCount()));
}
return booleanBuilder;
}
@Transactional(readOnly = true)
public List<AppUser> findByWhere(AppUserDTO dto) {
return jpaQueryFactory.selectFrom(appUser)
.where(setWhereBuilder(dto))
.fetch();
}