가급적 네이티브 쿼리는 사용하지 않는 게 좋음, 정말 어쩔 수 없을 떄 사용

최근에 나온 궁극의 방법 → 스프링 데이터 projections 사용

@Query(value = "select * from member where username = ?", nativeQuery = true)
Member findByNativeQuery(String username);

이렇게 할 수 있다.

한계가 너무 많다.

엔티티 조회보다는 DTO로 통계성 데이터를 가져오는 것인데 반환 타입이 몇가지가 지원이 안된다.

차라리 커스텀 repository를 만들어서 JDBC Template이나 Mybatis와 엮어서 사용하는 것을 권장한다.

앱 로딩 시점에서 타입체크가 안됨 동적 쿼리도 안된다.

최근

projection이 나오면서 좀 편하게 쓸 수가 있다.

@Query(value = "select m.member_id as id, m.username, t.name as teamName from member m left join team t",
			countQuery = "select count(*) from member",
			nativeQuery = true)
	Page<MemberProjection> findByNativeProjection(Pageable pageable);
@Test
public void nativeQuery() {
	Team teamA = new Team("teamA");
	em.persist(teamA);

	Member m1 = new Member("m1", 10, teamA);
	Member m2 = new Member("m2", 20, teamA);
	em.persist(m1);
	em.persist(m2);

	em.flush();
	em.clear();

	Page<MemberProjection> findMembers = memberRepository.findByNativeProjection(PageRequest.of(0, 10));
	List<MemberProjection> content = findMembers.getContent();
	for (MemberProjection findMember : content) {
		System.out.println(findMember.getUsername() + " : " + findMember.getTeamName());
	}
}

이번에 들어온 기능