Querydsl | querydsl DML

DoItDev·2021년 8월 1일
0
post-thumbnail

들어가기 앞어서

querydsl 자체는 jpa 에서 query 를 만들때 만들수 없는 부분을 부가적으로 만들수 있는 장점이 있다.
전 포스트에서 querydsl 설정을 했다면 아마 구동하는데 있어서 문제는 없을 것이다.
보통 CRUD 라고 표현을 하지만 querydsl 을 사용을 했봤는데 ...
insert / create 관련된 문서가 없었다 ... 그래서 포스팅에서도 C 를 뻇다...

querydsl setting

Q Class Import

스크린샷 2021-08-01 오후 12 49 34

complieQuerydsl 이라는 것을 실행을 시키면 아래와 같이 build 안에 qclass 가 생성이 된다.

스크린샷 2021-08-01 오후 12 54 36

Repository Support class

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 절

가장 기본적인 쿼리 select from 절 을 querydsl 을 사용을 하여서 만드는 방법이다.
주입 받은 JPAQueryFactory 을 가지고 selectFrom 이라는 메소드를 이용하여서
데이터를 가지고 올 수 가 있다.

    @Transactional(readOnly = true)
    public List<AppUser> findByAll() {
        return jpaQueryFactory.selectFrom(appUser).fetch();
    }

Update 절

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 절

delete 메소드의 경우에도 마찬가지이다.
QuerydslRepositorySupport 에 내장되어 있는 메소드를 이용하여서 사용을 한다
update 절과 마찬가지이다 @Transactional 어노테이션을 사용을 해야 쿼리가 실행을 된다.

    @Transactional
    public Long delete(Long id) {
        return delete(appUser).where(appUser.id.eq(id)).execute();
    }

Dynamic Where 절

단순 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;
    }

select from 절에 where 절

    @Transactional(readOnly = true)
    public List<AppUser> findByWhere(AppUserDTO dto) {
        return jpaQueryFactory.selectFrom(appUser)
                .where(setWhereBuilder(dto))
                .fetch();
    }
profile
Back-End Engineer

0개의 댓글