강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

soojinkimss님의 프로필 이미지
soojinkimss

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

서브 쿼리

from 절의 서브 쿼리에서 여러 값 조회

작성

·

102

0

[질문 내용]

from 절의 서브 쿼리를 작성하였을 때 조회로 여러 값이 나오게 테스트를 한번 만들어 보았는데요.

// 페이징 쿼리
String query = "select new jpqljpa.MemberDTO(mm.mUser, mm.mAge) from (select m.username mUser, m.age mAge from Member m) mm";
List<Member> result = em.createQuery(query, Member.class).getResultList();

System.out.println("result = " + result.get(0));

이렇게 하였을 때, 에러없이 나오긴합니다. 어떤 메커니즘으로 해당 쿼리가 문제없이 나오는지 구체적으로 알려주실수 있나요?

 

그리고 추가 질문으로 출력된 결과가

result = jpqljpa.MemberDTO@4def42c3

객체 메모리값으로 나오게되었는데 이름, 나이의 값을 출력하고싶다면 어떻게 코드를 쳐야 할까요?

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. soojinkimss님

AI 인턴이 잘 답변해주었는데요.

추가로 말씀드리자면 강의 메뉴얼에 추가된 내용처럼 hibernate 최신버전 부터 해당 기능을 지원합니다.

감사합니다.

soojinkimss님의 프로필 이미지
soojinkimss
질문자

감사합니다~!

0

안녕하세요, 인프런 AI 인턴입니다.

soojinkimss님께서 질문하신 부분에 대해 설명드리겠습니다.

우선 from 절 내에 서브 쿼리가 있는 경우 JPA JPQL에서는 직접적으로 지원되지 않는 형태입니다. JPA는 JPQL을 통해 객체 지향 쿼리를 지원하고, 데이터베이스의 SQL 서브 쿼리와 같은 복잡한 구조는 사용할 수 없습니다. 대신 쿼리를 나누거나 추상화된 개체 매핑을 활용하는 방식을 사용해야 합니다.

현재 보여주신 코드가 실행되는 이유는 JPQL이 아니라 네이티브 SQL을 작성하거나, 다른 방법으로 쿼리를 구성한 것이 아닐까 사료됩니다. 예를 들어, Hibernate의 HQL이나 Entity Manager의 createNativeQuery를 통해 가능합니다.

추가 질문에 대해:

Java는 객체의 toString 메소드를 호출할 때 기본적으로 객체의 해시 값을 출력합니다. 이를 원하는 값으로 출력하기 위해서는 MemberDTO 클래스의 toString 메소드를 오버라이드해야 합니다. 다음과 같은 방법으로 toString 메소드를 추가해 보세요.

public class MemberDTO {
    private String mUser;
    private int mAge;

    public MemberDTO(String mUser, int mAge) {
        this.mUser = mUser;
        this.mAge = mAge;
    }

    @Override
    public String toString() {
        return "MemberDTO{" +
                "mUser='" + mUser + '\'' +
                ", mAge=" + mAge +
                '}';
    }
}

이렇게 toString 메소드를 정의하시면, 출력 시 mUsermAge의 값이 출력될 것입니다.

추가로 필요한 부분이 있으면 언제든지 질문해 주세요!

참고 자료로서 관련 문서의 URL도 함께 공유드립니다:
Spring Data JPA - Reference Documentation

soojinkimss님의 프로필 이미지
soojinkimss

작성한 질문수

질문하기