Projects/Personal project - 게시판 만들기

JPQL문에서 Enum 사용하기

마손리 2023. 5. 30. 19:51

멤버 엔티티

@Entity
@NoArgsConstructor
@Getter
@Setter
public class Member extends Auditable {
	...
    ...
    @Enumerated(value = EnumType.STRING)
    @Column(length = 20, nullable = false)
    private MemberStatus memberStatus = MemberStatus.MEMBER_ACTIVE;
    ...
    ...
    public enum MemberStatus{
        MEMBER_ACTIVE("활동중"),
        MEMBER_SLEEP("활동 중지"),
        MEMBER_QUIT("활동 정지");
        @Getter
        private String status;

        MemberStatus(String status) {
            this.status = status;
        }
    }
}

 

 

목표 및 문제점 발견

위와 같이 Member 엔티티에 회원의 활동 상태를 열거형으로 DB에 전달해 주고 있다. 

 

이후 JpaRepository의 findById() 메서드를 사용하여 "활동 정지" 상태인 회원을 제외한 회원들을 조회하는 쿼리문을 작성해 주려고 했는데 처음에는 아래와 같이 그냥 열거타입을 이용하여 JPQL문을 작성해 주면 되는줄 알았다.

 

 

잘못된 JPQL문과 에러

public interface MemberRepository extends JpaRepository<Member, Long> {
    @Query("select m from Member m where m.memberId = :memberId and not (m.memberStatus = MEMBER_QUIT)")
    Optional<Member> findById(Long memberId);
}

 

 

문제점 해결

멤버 엔티티를 다시 살펴보면 MEMBER_STATUS 컬럼에 @Enumerated(value = EnumType.STRING) 에너테이션과 어트리뷰트를 이용하여 해당 열거타입을 문자형으로 지정해 주었기에 따옴표(' ')를 이용하여 해당 열거타입의 상수명을 넣어주어 해결했다.

 

 

완성된 JPQL문

public interface MemberRepository extends JpaRepository<Member, Long> {
    @Query("select m from Member m where m.memberId = :memberId and not (m.memberStatus = 'MEMBER_QUIT')")
    Optional<Member> findById(Long memberId);
}