먹었으면 뇌를 쓰자
JPQL TypedQuery 화면 출력할 때 "이것" 꼭 해줘야 한다 본문
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() 메소드를 새로 생성하여 원하는 출력결과를 도출시키기 위해 오버라이딩을 거치는 것입니다.
'Framework > JPA' 카테고리의 다른 글
Query dsl - Querying, Join, Paging 구현하기 (+query dsl 5.0.0 fetchResult count 쿼리 작성) (0) | 2022.11.29 |
---|---|
3초 만에 이해하는 @OneToMany 연관관계 헬퍼 메소드 쓰는 법 (0) | 2022.11.28 |
자바 기본 생성자, 인수 생성자는 같이 입력해야 한다 왜냐면... (0) | 2022.11.28 |
자바에서 getter and setter 쓰는 이유 (0) | 2022.11.28 |
자바 헬퍼 메소드(Helpler method) 쉽게 이해하기 (0) | 2022.11.27 |