먹었으면 뇌를 쓰자

JPQL TypedQuery 화면 출력할 때 "이것" 꼭 해줘야 한다 본문

Framework/JPA

JPQL TypedQuery 화면 출력할 때 "이것" 꼭 해줘야 한다

뇌이비 2022. 11. 28. 20:11

 

1. TypedQuery 실행

 

 

@OneToMany 연관관계를 매핑하고,

One과 Many에 각각 데이터를 입력하고,

TypedQuery로 select문을 실행하는 과정이다. 

 

TypedQuery query = em.createQuery
("SELECT DISTINCT p FROM Person p JOIN FETCH p.addresses", Person.class);
     List<Person> resultList = query.getResultList();
     resultList.stream().forEach(v-> System.out.println("v = " + v));

 

 

query.getResultList()는

결과가 하나 이상인 경우 리스트로 반환해주는 메소드이다. 

가령 게시판에 게시물이 연관관계로 설정된 경우, 여러 게시물이 반환될 수 있도록 한다. 

 

여기까지는 이해가 갔는데

마지막 줄의 stream() 메소드와 forEach() 메소드가 뭔지 잘 모르겠다.

 

알고보니 이것은 전혀 그렇게 안 생겼지만

"반복문"이었다!

 

 

//기본 for문
for (int i = 0; i < list.size(); i++) {
  System.out.println(list.get(i));
}

//향상된 for문
for (String item : list) {
  System.out.println(item);
}

//stream().forEach()
list.stream().forEach(System.out::println);

 

 코드 출처 https://tecoble.techcourse.co.kr/post/2020-05-14-foreach-vs-forloop/

 

 

 

그러니까 resultList.stream().forEach(v-> System.out.println("v = " + v)); 이 코드는

배열 결과 값의 객체인 resultList 에 for문으로 값을 넣어주고 있는 것이었다. 

 

신기하다~.

 

 

 

 

 

2. TypedQuery 출력

 

 

하지만, 코드 3줄에 별 이상이 없는데 화면에는 출력이 잘 되지 않았다.

 

 

 

 

 

 

강의를 보니 Person.class에 toString() 메소드를 넣어 @Override을 하니 출력이 잘 됐다.

 

 

 

 

 

 

 

쉽게 정리하면,

모든 클래스에는 toString() 메소드가 기본으로 들어있는데, 

오버라이딩으로 메소드를 재정의하지 않는 이상, 

다른 클래스의 변수를 출력하려 할 때  '해시코드값'(결과를 참조한 주소)이 반환된다.

 

나는 다른 클래스의 변수를 있는 그대로 보고 싶다.

이를 위해 해당 클래스에서 toString() 메소드를 가시화하고 오버라이딩해서 

출력 값을 '문자열'로 반환시킬 수 있다.

 

IntelliJ에서는 toString() 메소드를 실행하면 

자동으로 해당 클래스의 변수들을 문자열 반환할 수 있게 설정되어 있는 것이다.

 

 

toString()을 오버라이드 하지않고 써보셨는지 모르겠는데 어떤 한 reference variable 즉 object A안에 3이라는 int형 정수를 저장했다고 합시다. 그리고 System.out.print(A); 를 통해 우리는 3이라는 결과값을 도출해내고자 합니다. 그러나, 클래스명@192842 같은 이상한 문자가 등장합니다. 오류가 발생한 것이 아닙니다. 정확한 출력 결과입니다. java의 슈퍼클래스인 object class에 속해져 있는 toString()은 저장된 값을 출력하는 것이 아니라 그 객체에 대한 주소값을 출력합니다. 따라서, 원하던 출력결과를 도출해내지 않으므로 toString() 메소드를 새로 생성하여 원하는 출력결과를 도출시키기 위해 오버라이딩을 거치는 것입니다.

출처 https://kin.naver.com/qna/detail.naver?d1id=1&dirId=1040201&docId=256691360&qb=7J6Q67CUIHRvU3RyaW5nIOyYpOuyhOudvOydtOuUqQ==&enc=utf8&section=kin.ext&rank=12&search_sort=0&spq=0 

 

 

 

 

 
Comments