์ฟผ๋ฆฌ ๋ฉ์๋
์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์ ๊ณตํ๋ ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ์ ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฉ์๋์ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ
- @Query๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ ์
๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ
Optional<Member> findByUsername(String username);
์์ ์์์ฒ๋ผ ๋ฉ์๋์ ์ด๋ฆ๋ง ์ค์ ํจ์ผ๋ก์จ ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
์ค์ํ ๊ฒ์ ํด๋น ํ๋๊ฐ ์ํฐํฐ์ ์กด์ฌํด์ผ ํ๋ฉฐ, ํ๋๋ช ๊ณผ ๋ฉ์๋ ์ด๋ฆ์ด ๋ฐ๋์ ์ผ์นํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ์ง ์๋๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ์ด
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#appendix.query.method.subject
์ ์ฌ์ดํธ์์ find, exist ๋ฑ์ ์ฌ์ฉ ๊ฐ๋ฅํ subject keyword๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ํํฐ๋ง ์กฐ๊ฑด
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
์ ์ฌ์ดํธ์์ ๊ฐ๋ฅํ ํํฐ ์กฐ๊ฑด๋ค๊ณผ ์ฌ์ฉ๋ฒ์ ์ ์ ์์ต๋๋ค.
์ถ๊ฐ๋ก ํด๋น ๊ธฐ๋ฅ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ์ @Param์ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค.
๊ฒฐ๊ณผ ๊ฐ์ ์ ํ
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result
User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
Slice<User> findTop3ByLastname(String lastname, Pageable pageable);
List<User> findFirst10ByLastname(String lastname, Sort sort);
List<User> findTop10ByLastname(String lastname, Pageable pageable);
@Query
์ธํฐํ์ด์ค ๋ฉ์๋๊ฐ ์คํํ JPQL์ ์์ฑํ ์ ์๋๋ก ํ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
๋ค์์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username =: username and m.age = :age")
List<Member> findUser(@Param("username") String username, @Param("age") int age);
}
์์ ๊ฐ์ด ๋ฉ์๋ ์์ ์คํํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ก ์์ฑํ ์ ์์ต๋๋ค.
๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ๋ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋์ด๋ ์๋ก ์ด๋ฆ์ด ๊ธธ์ด์ง๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ฉ์๋ ์ด๋ฆ์ ๊ฐ๋ตํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
@Query๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ @Param์ ํตํด ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ์งํํด ์ฃผ์ด์ผ ํฉ๋๋ค.
ํน์ ๊ฐ ์กฐํํ๊ธฐ
public interface MemberRepository extends JpaRepository<Member,Long> {
@Query("select m.username from Member m")
List<Member> findUsernames();
}
DTO ๋ฐ๋ก ์กฐํํ๊ธฐ
public interface MemberRepository extends JpaRepository<Member,Long> {
@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, m.age) from Member m")
List<Member> findUserDtos();
}
IN์ ์ฌ์ฉํ๊ธฐ
public interface MemberRepository extends JpaRepository<Member,Long> {
@Query("select m from Member m where m.username in :names")
List<Member> findUsernames(@Param("names") List<String> names );
}
Reference
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ํ์ด์ง ์ ๋ฆฌ (JPA, Data JPA, QueryDSL) (1) | 2022.07.28 |
---|---|
[Spring Data JPA] - ๋ฐํ ํ์ ์ ์ข ๋ฅ (0) | 2022.07.28 |
[Spring Data JPA] - ์ค์ ๊ฐ๋ ์๊ฐ (0) | 2022.07.28 |
[JPA] ๋ณตํฉ ํค์ ์๋ณ ๊ด๊ณ ๋งคํ (0) | 2022.07.24 |
[JPA] save()์ ์๋ณ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋์ํ ๊น? (feat. ์ฝํ๋ฆฐ์์ JPA ์ฌ์ฉํ๊ธฐ) (3) | 2022.07.18 |