[Spring Data JPA] - ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ
์ฟผ๋ฆฌ ๋ฉ์๋
์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์ ๊ณตํ๋ ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ์ ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฉ์๋์ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ
- @Query๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ ์
๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ
Optional<Member> findByUsername(String username);
์์ ์์์ฒ๋ผ ๋ฉ์๋์ ์ด๋ฆ๋ง ์ค์ ํจ์ผ๋ก์จ ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
์ค์ํ ๊ฒ์ ํด๋น ํ๋๊ฐ ์ํฐํฐ์ ์กด์ฌํด์ผ ํ๋ฉฐ, ํ๋๋ช ๊ณผ ๋ฉ์๋ ์ด๋ฆ์ด ๋ฐ๋์ ์ผ์นํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ์ง ์๋๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ์ด
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#appendix.query.method.subject
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
์ ์ฌ์ดํธ์์ find, exist ๋ฑ์ ์ฌ์ฉ ๊ฐ๋ฅํ subject keyword๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ํํฐ๋ง ์กฐ๊ฑด
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
์ ์ฌ์ดํธ์์ ๊ฐ๋ฅํ ํํฐ ์กฐ๊ฑด๋ค๊ณผ ์ฌ์ฉ๋ฒ์ ์ ์ ์์ต๋๋ค.
์ถ๊ฐ๋ก ํด๋น ๊ธฐ๋ฅ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ์ @Param์ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค.
๊ฒฐ๊ณผ ๊ฐ์ ์ ํ
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
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
์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ๋ฐ์ดํฐ JPA๋ ๊ธฐ์กด์ ํ๊ณ๋ฅผ ๋์ด ๋ง์น ๋ง๋ฒ์ฒ๋ผ, ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ตฌํ ํด๋์ค ์์ด ์ธํฐํ์ด์ค ๋ง์ผ๋ก ๊ฐ๋ฐ์ ์๋ฃํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ณต ๊ฐ๋ฐํด์จ ๊ธฐ๋ณธ CRUD ๊ธฐ๋ฅ๋ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค
www.inflearn.com