작성
·
114
·
수정됨
0
안녕하세요.
강의 잘 보고 있습니다.
em.createQuery에서 distinct를 사용해도 DB에서 받아올 때는 뻥튀기된 데이터를 받아오는 것이 맞을까요?
em.createQuery의 반환값으로 List<Order>에 담을 때 Order의 id 중복을 제거해서 담은 뒤 반환한다는 것이 맞을까요?
결국 distinct를 사용하나 안 하나 DB에 나가는 쿼리는 같을까요?
public List<Order> findAllWithItem() {
return em.createQuery(
"select distinct o from Order o" +
" join fetch o.member m" +
" join fetch o.delivery d" +
" join fetch o.orderItems oi" +
" join fetch oi.item i", Order.class)
.getResultList();
}
참고한 질문과 답변입니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
저스트님의 질문에 대해 답변드리겠습니다.
distinct
를 em.createQuery
에서 사용하는 경우, JPA는 SQL 쿼리에도 DISTINCT
를 추가하여 실행합니다. 그러나 실제 데이터베이스에서 받아오는 데이터의 중복 제거 여부는 데이터베이스의 구현 및 쿼리의 구조에 따라 다를 수 있습니다. 즉, JPA 단에서 distinct
를 사용하여도, 실제로 데이터베이스에서 중복된 데이터를 제거하여 결과를 반환하는 것은 데이터베이스의 동작 방식에 따릅니다.
em.createQuery
의 반환값으로 List<Order>
에 담을 때, 위의 쿼리에서 사용된 distinct
는 JPA가 SQL 쿼리를 생성할 때 해당 키워드를 추가합니다. 이는 Order
엔티티의 중복을 제거하려는 의도로 사용됩니다. 그러나 실제로 Order
의 ID 중복이 제거되어 담기는 것은 이 쿼리 자체와 데이터베이스의 처리 방식에 달려 있습니다. Fetch Join을 사용할 경우, 연관된 엔티티까지 고려하여 중복을 제거하려는 목적으로 distinct
가 사용됩니다.
distinct
를 사용하건 안 하건, DB에 나가는 쿼리 문법 자체에는 차이가 있습니다. distinct
를 사용하면 생성되는 SQL 쿼리에도 DISTINCT
키워드가 포함됩니다. 하지만 SQL 쿼리의 최종 결과에 얼마나 영향을 미치는지는 실행되는 SQL, 데이터베이스의 구현, 데이터의 형태 등 여러 요인에 의해 결정됩니다.
추가적으로, distinct
의 사용이 필요한 시나리오와 JPA에서의 처리 방식에 대해 더 자세히 알고싶다면 Spring Data JPA의 공식 문서에서 “Query Creation” 섹션을 참조하실 것을 추천드립니다. 여기에는 @Query
를 사용하여 복잡한 쿼리를 작성할 때 distinct
를 어떻게 활용할 수 있는지에 대한 정보가 포함되어 있습니다.
정보 출처:
- Spring Data JPA - Query Creation
질문에 대한 답변이 도움이 되었기를 바랍니다.