특정 조건에 따라 limit, offset을 적용해야 할 경우

JPAQuery 를 사용하여 limit, offset 을 적용하기 전 쿼리를 선언하고, 원하는 조건에 따라 limit, offset 을 적용한다.

JPAQuery<RobotList> query = queryFactory.select(qRobot)  
        .from(qRobot)  
        .leftJoin(qWork)  
        .on(qRobot.lastExecuteWorkSequence.eq(qWork.workSequence))  
        .where(getWhereClause(robotSearchForm))  
        .orderBy(getOrderSpecifier(robotSearchForm.getSortKey(), robotSearchForm.getSortOrder()));  
  
if (robotSearchForm.getPageRowCount() > 0){  
        query.offset(robotSearchForm.getStartRowNo2())  
        .limit(robotSearchForm.getEndRowNo());  
}

coalesce()

각 DB 별로 null을 처리하는 함수가 있기때문에 Querydsl도 이에 대응하는 coalesce() 함수가 있다.

qCustomer.age.coalesce(0).asNumber().sum()

위 예제는 Customer 테이블의 나이 항목이 null일 경우 0을 아닐 경우 나이를 합산하는 예시이다.

from절의 재사용

from절을 재사용하기 위해서는 JPAQuery 타입으로 쿼리 결과를 반환한다.

private JPAQuery<?> getNewFromClauseWorkExecutionList(String summaryType){  
    JPAQuery<?> fromQuery = queryFactory  
            .from(qTaskResultView)  
            .leftJoin(qTaskProcess)  
            .on(qTaskProcess.taskQueueSequence.eq(qTaskResultView.taskQueueSequence))  
            .leftJoin(qWork)  
            .on(qTaskResultView.workSequence.eq(qWork.workSequence));  
  
    if (summaryType.equals("RBT")) {  
        fromQuery.innerJoin(qRobot).on(qTaskResultView.robotSequence.eq(qRobot.robotSequence));  
    }  
  
    return fromQuery;  
}

groupBy 절의 재사용

Expression Array 타입으로 반환하면 재사용이 가능하다.

private Expression<?>[] getWorkExecutionListGroupByClause(WorkExecutionResultSearchForm workExecutionResultSearchForm) {  
    List<Expression<?>> groupbyExpression = new ArrayList<>();  
    groupbyExpression.add(qWork.workSequence);  
    groupbyExpression.add(qWork.workName);  
    groupbyExpression.add(qTaskResultView.groupSequence);  
  
    if (workExecutionResultSearchForm.getSummaryType().equals("RBT")) {  
        groupbyExpression.add(qTaskProcess.taskQueueSequence);  
        groupbyExpression.add(qRobot.robotSequence);  
        groupbyExpression.add(qRobot.robotName);  
        groupbyExpression.add(qTaskResultView.lastExecuteDateTime);  
        groupbyExpression.add(qTaskResultView.endDateTime == null ? qTaskResultView.lastExecuteDateTime : qTaskResultView.endDateTime);  
    }  
  
    return groupbyExpression.toArray(new Expression<?>[0]);  
}

count(*)



연결문서

댓글남기기