diff --git a/src/main/kotlin/com/msg/gauth/domain/user/repository/CustomUserRepositoryImpl.kt b/src/main/kotlin/com/msg/gauth/domain/user/repository/CustomUserRepositoryImpl.kt index 25c9a5dd..d9f9e4b2 100644 --- a/src/main/kotlin/com/msg/gauth/domain/user/repository/CustomUserRepositoryImpl.kt +++ b/src/main/kotlin/com/msg/gauth/domain/user/repository/CustomUserRepositoryImpl.kt @@ -6,7 +6,10 @@ import com.msg.gauth.domain.user.QUserRole.userRole import com.msg.gauth.domain.user.User import com.msg.gauth.domain.user.enums.UserRoleType import com.msg.gauth.domain.user.enums.UserState +import com.querydsl.core.types.Order +import com.querydsl.core.types.OrderSpecifier import com.querydsl.core.types.dsl.BooleanExpression +import com.querydsl.core.types.dsl.PathBuilder import com.querydsl.jpa.impl.JPAQueryFactory import org.springframework.stereotype.Repository @@ -16,15 +19,37 @@ class CustomUserRepositoryImpl( ) : CustomUserRepository { override fun search(grade: Int, classNum: Int, keyword: String): List { - return jpaQueryFactory.selectFrom(user) + val gradeEq = gradeEq(grade) + val classNumEq = classNumEq(classNum) + val stateEq = stateEq(UserState.CREATED) + val roleEq = roleEq(UserRoleType.ROLE_STUDENT) + + val pathBuilder = PathBuilder(user.type, user.metadata) + val orderSpecifiers = mutableListOf>() + + val query = jpaQueryFactory.selectFrom(user) .leftJoin(userRole).on(userRole.user.eq(user)).fetchJoin() .where( - gradeEq(grade), - classNumEq(classNum), - keywordLike(keyword), - stateEq(UserState.CREATED), - userRole.userRoleType.eq(UserRoleType.ROLE_STUDENT) - ).fetch() + gradeEq, + classNumEq, + stateEq, + roleEq, + keywordLike(keyword) + ) + + + if(gradeEq == null) { + orderSpecifiers.add(OrderSpecifier(Order.ASC, pathBuilder.get(user.grade))) + } + + if(classNumEq == null) { + orderSpecifiers.add(OrderSpecifier(Order.ASC, pathBuilder.get(user.classNum))) + } + + orderSpecifiers.add(OrderSpecifier(Order.ASC, pathBuilder.get(user.num))) + + return query + .orderBy(*orderSpecifiers.toTypedArray()).fetch() } private fun gradeEq(grade: Int): BooleanExpression? = @@ -36,8 +61,8 @@ class CustomUserRepositoryImpl( private fun keywordLike(keyword: String): BooleanExpression? = if(keyword.isNotEmpty()) user.name.like("%${keyword}%") else null - private fun roleContains(userRoleType: UserRoleType): BooleanExpression = - user.roles.contains(userRoleType) + private fun roleEq(userRoleType: UserRoleType): BooleanExpression = + userRole.userRoleType.eq(userRoleType) private fun stateEq(userState: UserState): BooleanExpression = user.state.eq(userState)