[Spring] DB에서 중복제거하고 조회하기

Dev_ch·2023년 2월 25일
0
post-custom-banner

항상 JPA를 이용하여 정보를 조회하고 객체에 담는 무한 반복의 일상을 살던 도중, 테이블안에서 중복되는 컬럼들을 하나씩 list안에 담아야 했다. 해당 방법은 최고의 방법은 아닐 수 있지만, 리스트 형식의 중복되는 컬럼들은 하나씩만 담아야 할때 사용할 수 있다.


1. 문제 상황

유저가 댓글을 단 글의 ID를 조회하려했으나, 유저가 한 글에 댓글을 여러개 달아놓는다면 중복되는 글의 ID가 발생하여 중복되는 글의 ID는 오로지 하나만 리스트에 담기도록 해야한다.

2. 해결

private final EntityManger em;

서비스가 구현되는 클래스에서 EntityManger 객체를 하나 생성해준이후 NativeQuery로 중복되는 글의 ID 를 list 형태로 가져올 것 이다.

        Query query = em.createNativeQuery(
                "" +
                        "SELECT DISTINCT content_id \n" +
                        "FROM comment AS c \n" +
                        "WHERE user_id = ?"
        ).setParameter(1, user.getId());

우리는 SQL 구문에서 DISTINCT를 이용하여 유저가 댓글을 남긴 글들의 ID가 중복되는 것을 제거해주고 list 형태로 담아주었다.

List<BigInteger> contentIntegerId = query.getResultList();

해당 Query는 list<?> 의 형태로 객체를 생성해 넣을 수 있지만 해당 쿼리는 BigInteger로 리스트 값을 제공해주기 때문에 일반화되지 않았다는 경고가 뜨지만 문제없다.

만약 해당 BigInteger 타입을 변환해주어야 한다면

        contentIntegerId.forEach(id ->
                contentId.add(id.longValue())
        );

forEach문을 통해 타입을 변경해주도록 하자.


사실 굳이 NativeQuery를 사용하지 않아도 가능한 방법들이 있을 것 같다. 추후 리팩터링을 하면서 코드를 더 개선해봐야겠다 🥹

profile
내가 몰입하는 과정을 담은 곳
post-custom-banner

0개의 댓글