diff --git a/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberProjection.java b/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberProjection.java new file mode 100644 index 00000000..7e78dd84 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberProjection.java @@ -0,0 +1,8 @@ +package com.example.springdatajpa.repository; + +public interface MemberProjection { + + Long getId(); + String getUsername(); + String getTeamName(); +} diff --git a/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java b/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java index b56b43fe..40aba6b8 100644 --- a/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java +++ b/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java @@ -72,4 +72,12 @@ public interface MemberRepository extends JpaRepository, MemberRep // List findProjectionsByUsername(@Param("username") String username); List findProjectionsByUsername(@Param("username") String username, Class type); + @Query(value = "select * from member where username = ?", nativeQuery = true) + Member findByNativeQuery(String username); + + @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 findByNativeProjection(Pageable pageable); } diff --git a/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java b/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java index 4a9f49df..8e873918 100644 --- a/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java +++ b/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java @@ -383,5 +383,33 @@ public class MemberRepositoryTest { System.out.println("nestedClosedProjections.getTeam().getName() = " + nestedClosedProjection.getTeam().getName()); } } + + @Test + void nativeQuery() { + // given + Team teamA = new Team("teamA"); + em.persist(teamA); + + Member member1 = new Member("member1", 0, teamA); + Member member2 = new Member("member2", 0, teamA); + em.persist(member1); + em.persist(member2); + + em.flush(); + em.clear(); + + // when + Member result = memberRepository.findByNativeQuery("member1"); + System.out.println("result = " + result); + + Page results = memberRepository.findByNativeProjection(PageRequest.of(0, 10)); + List content = results.getContent(); + for (MemberProjection memberProjection : content) { + System.out.println("memberProjection.getUsername() = " + memberProjection.getUsername()); + System.out.println("memberProjection.getTeamName() = " + memberProjection.getTeamName()); + } + } + + }