항상 JPA를 이용하여 정보를 조회하고 객체에 담는 무한 반복의 일상을 살던 도중, 테이블안에서 중복되는 컬럼들을 하나씩 list안에 담아야 했다. 해당 방법은 최고의 방법은 아닐 수 있지만, 리스트 형식의 중복되는 컬럼들은 하나씩만 담아야 할때 사용할 수 있다.
유저가 댓글을 단 글의 ID를 조회하려했으나, 유저가 한 글에 댓글을 여러개 달아놓는다면 중복되는 글의 ID가 발생하여 중복되는 글의 ID는 오로지 하나만 리스트에 담기도록 해야한다.
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를 사용하지 않아도 가능한 방법들이 있을 것 같다. 추후 리팩터링을 하면서 코드를 더 개선해봐야겠다 🥹