가급적 네이티브 쿼리는 사용하지 않는 게 좋음, 정말 어쩔 수 없을 떄 사용
최근에 나온 궁극의 방법 → 스프링 데이터 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());
}
}
이번에 들어온 기능