์ถ์ฒ : joont92.github.io/jpa/Spring-Data-JPA/
์ ์ฌ์ดํธ๊ฐ ๋๋ฌด ์ ๋ฆฌ๋ฅผ ์ ํด ๋์๋ค. ์กฐ๊ธ๋ง ํผ์จ๋ค๋ ๊ฒ์ด ํ๋๋ ๋บ ์ ์๋ ์ฃผ์ฅ๊ฐ์ ๊ธ์ด๋ฏ๋ก ๋๋ฌด ๊ฐ์ฌํ๋ค.
JpaRepository(๊ณตํต ์ธํฐํ์ด์ค)
JpaRepository๋ ์์ ์ธ๊ธํ๋ CRUD ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ณตํต ์ธํฐํ์ด์ค์ด๋ค.
public interface MemberRepository extends JpaRepository<Member, Long>{
}
์ด ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ง ์์ฑํ๋ฉด ํด๋น ์ํฐํฐ์ ๋ํ CRUD๋ฅผ ๊ณต์ง๋ก ์ฌ์ฉํ ์ ์๊ฒ๋๋ค.
์ ๋ค๋ฆญ์๋ ์ํฐํฐ ํด๋์ค์ ์ํฐํฐ ํด๋์ค๊ฐ ์ฌ์ฉํ๋ ์๋ณ์ ํ์ ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
JpaRepository์ ๊ณ์ธต๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
๋ณด๋ค์ํผ ์คํ๋ง ๋ฐ์ดํฐ ํ๋ก์ ํธ๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ
JpaRepository์์ JPA์ ํนํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ๋ก ์ ๊ณตํ๋ค.
์ค์ ๊ตฌํ์ฒด
๊ณตํต ์ธํฐํ์ด์ค์ธ JpaRespository๋ org.springframework.data.jpa.repository.support.SimpleJpaRepository ํด๋์ค๊ฐ ๊ตฌํํ๋ค.
@Repository // 1
@Transactional(readOnly = true) // 2
public class SimpleJpaRepository<T, ID> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
@Transactional // 3
public <S extends T> S save(S entity) { // 4
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
// ....
}
- @Repository ์ ์ฉJPA ์์ธ๋ฅผ ์คํ๋ง์ด ์ถ์ํ ํ ์์ธ๋ก ๋ณํํ๋ค.
- Transactional(readOnly = true) ์ ์ฉ
- ์ ์ฒด์ ์ผ๋ก ํธ๋์ญ์ ์ด ์ ์ฉ๋์ด ์๋ค. ์ด๋ก์ธํด ์๋น์ค์์ ํธ๋์ญ์ ์ ์ ์ฉํ์ง ์์ผ๋ฉด ๋ ํ์งํ ๋ฆฌ์์ ํธ๋์ญ์ ์ ์์ํ๊ฒ ๋๋ค.
- ๊ณตํต ์ธํฐํ์ด์ค์๋ ์กฐํํ๋ ๋ฉ์๋๊ฐ ๋ง์ผ๋ฏ๋ก ์ ์ฒด์ ์ผ๋ก readOnly=true๋ฅผ ์ ์ฉํด์ ์ฝ๊ฐ์ ์ฑ๋ฅํฅ์์ ์ป๋๋ค.
- Transactional
- ์กฐํ ๋ฉ์๋๊ฐ ์๋๋ผ์ readOnly=true๊ฐ ๋น ์ง๊ฒ ํ๋ค.
- save
- ๋ณด๋ค์ํผ ์ ์ฅํ ์ํฐํฐ๊ฐ ์๋ก์ด ์ํฐํฐ๋ฉด ์ ์ฅํ๊ณ ์ด๋ฏธ ์๋ ์ํฐํฐ๋ฉด ๋ณํฉํ๋ค.
- ์ฌ๊ธฐ์ ์ฌ์ฉ๋๋ entityInformation.isNew๋ ์๋ณ์๊ฐ ๊ฐ์ฒด์ผ๋๋ null, primitive ํ์ ์ผ๋๋ 0์ด๋ฉด ์๋ก์ด ๊ฐ์ฒด๋ผ๊ณ ํ๋จํ๋ค.
- Persistable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ฉด ์์ ์กฐ๊ฑด์ ์ง์ ์ ์ํ ์ ์๋ค.
๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ
์ธํฐํ์ด์ค์ ์ ์ธํ ๋ฉ์๋์ ์ด๋ฆ์ผ๋ก ์ ์ ํ JPQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ฃผ๋ ๋ง๋ฒ๊ฐ์(ใ ใ ) ๊ธฐ๋ฅ์ด๋ค.
public interface MemberRepository extends JpaRepository<Member, Long>{
List<Member> findByEmailAndName(String email, String name);
}
์ด๋ ๊ฒ๋ง ์์ฑํ๋ฉด Spring Data JPA๊ฐ ๋ฉ์๋ ์ด๋ฆ์ ๋ถ์ํด์ JPQL์ ์์ฑํ๋ค.
์์ ๋ฉ์๋๋ฅผ ํตํด ์์ฑ๋๋ JPQL์ ์๋์ ๊ฐ๋ค.
SELECT m FROM Member m WHERE m.email = ?1 AND m.name = ?2
๋ฌผ๋ก ์ ํด์ง ๊ท์น์ ์๋ค.
ํ์ฌ ๋ณด๋๊น ์๊ฐ๋ณด๋ค ๊ต์ฅํ ๋ง์ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.details
- findByNameAndEmail ์ ํํ๋ก ์์ฑ. By ๋ค๋ถํฐ ํ์ฑ (์กฐ๊ฑด์ ์ฌ๊ธฐ์)
- findDistinctBy ๋ก distinct ๊ฐ๋ฅ
- ์ํฐํฐ ํ์ ๊ฐ๋ฅ. camel case๋ก ํด๋ ๋์ง๋ง ์ ๋งคํ๋ findByAddress_ZipCode ์ฒ๋ผ _๋ก ์ด์ด์ฃผ๋๊ฒ ์ข์ ๋ฏ
- findFirst3By, findTop10By, findFirstBy(1๊ฑด) ๋ก limit ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. findLast3By ๊ฐ์๊ฑด ์์
- findByAgeOrderByNameDesc ์ฒ๋ผ order by ๊ฐ๋ฅ
- findBy ๋ง๊ณ countBy, deleteBy๋ ์์
๋ฐํ ํ์
Spring Data JPA๋ ์ ์ฐํ ๋ฐํ ํ์
์ ์ง์ํ๋ค.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-return-types
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ํ๊ฑด ์ด์์ด๋ฉด ์ปฌ๋ ์
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , ๋จ๊ฑด์ด๋ฉด ๋ฐํ ํ์
์ ์ง์ ํ๋ค.
List<Member> findByMember(String name); // ์ปฌ๋ ์
Member findByEmail(String email); // ๋จ๊ฑด
๋จ๊ฑด์ ๊ฒฝ์ฐ T ํํ์ Optional<T> ํํ 2๊ฐ๋ก ๋ฐ์ ์ ์๋ค.
๊ฒฐ๊ณผ๊ฐ 2๊ฑด์ด์ ๋์ค๋ฉด javax.persistence.NonUniqueResultException ์์ธ๊ฐ ๋ฐ์ํ๊ณ ,
๊ฒฐ๊ณผ๊ฐ 0๊ฑด์ผ ๊ฒฝ์ฐ T๋ null, Optional<T>๋ Optional.empty() ๋ฅผ ๋ฆฌํดํ๋ค.
์ฐธ๊ณ ๋ก ๋จ๊ฑด์ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก query.getSingleResult()๋ฅผ ์ฌ์ฉํด์ ๊ฒฐ๊ณผ๊ฐ 0๊ฑด์ผ ๊ฒฝ์ฐ javax.persistence.NoResultException์ด ๋ฐ์ํด์ผํ์ง๋ง, ์ด๋ ๋ค๋ฃจ๊ธฐ๊ฐ ๊น๋ค๋ก์ฐ๋ฏ๋ก exception์ ๋ฐ์์ํค์ง ์๋ ๋ฐฉํฅ์ผ๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Named Query
์ํฐํฐ๋ xml์ ์์ฑํ Named Query๋ ์ฐพ์๊ฐ ์ ์๋ค.
@Entity
@NamedQuery(
name = "Member.findByName",
query = "select m from Member m where m.name = :name"
)
public class Member{
}
public interface MemberRepository extends JpaRepository<Member, Long>{
List<Member> findByName(@Param("name") String name);
}
Spring Data JPA๋ ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ ์ ํด๋น ์ด๋ฆ์ Named Query๋ฅผ ๋จผ์ ์ฐพ๋๋ค(์ ๋ต ๋ณ๊ฒฝ ๊ฐ๋ฅ)
๋๋ฉ์ธ ํด๋์ค + .(์ ) + ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ๋จผ์ ์ฐพ๊ณ , ์์ผ๋ฉด JPQL์ ์์ฑํ๋ค.
์์ ์ํฉ์์๋ Member.findByName Named Query๋ฅผ ์ฐพ๊ฒ ๋๋ค.
JPQL ์ง์ ์ ์
org.springframework.data.jpa.repository.Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
// ์์น๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ
public interface MemberRepository extends JpaRepository<Member, Long>{
@Query("SELECT m FROM Member m WHERE m.name = ?1")
Member findByName(String name);
}
// ์ด๋ฆ๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ
public interface MemberRepository extends JpaRepository<Member, Long>{
@Query("SELECT m FROM Member m WHERE m.name = :name")
Member findByName(@Param("name") String name);
}
์๋ฌด๋ฆฌ๋ด๋ ์์น๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ๋ ๊ฐ๊ทนํ์ด๋ค.
๋ด ์ฃผ๋ณ์ฌ๋์๋ ์์น๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐ๋ ์ฌ๋์ด ์์ผ๋ฉด ์ข๊ฒ ๋ค.
๋คํฐํฐ๋ธ ์ฟผ๋ฆฌ๋ ์ฌ์ฉํ ์ ์๋ค. nativeQuery = true ์ต์ ๋ง ์ฃผ๋ฉด ๋๋ค.
public interface MemberRepository extends JpaRepository<Member, Long>{
@Query(value = "SELECT * FROM Member WHERE name = ?0", nativeQuery = true)
Member findByName(String name);
}
๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ ์์น๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ๊ฐ 0๋ถํฐ ์์ํ๋ค.
๋ฒํฌ ์ฐ์ฐ
public interface MemberRepository extends JpaRepository<Member, Long>{
@Modifying
@Query("UPDATE Product p SET p.price = p.price * 1.1 WHERE p.stockAmount < :stockAmount")
int updatePrice(@Param("stockAmount") String stockAmount);
}
@Modifying์ ๋ช
์ํด์ค์ผ ํ๋ค.
๊ธฐ์กด ๋ฒํฌ ์ฐ์ฐ์ฒ๋ผ ์ํฅ๋ฐ์ ์ํฐํฐ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
์๋ค์ํผ ๋ฒํฌ ์ฐ์ฐ์ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๋ฌด์ํ๋ค.
๋ฒํฌ ์ฐ์ฐํ์ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ด๊ธฐํํ๊ณ ์ถ์ผ๋ฉด clearAutomatically ์ต์
์ true๋ก ์ฃผ๋ฉด ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ false์ด๋ค.
@Modifying(clearAutomatically = true)
@Query("~~")
// ~~~
ํ์ด์ง๊ณผ ์ ๋ ฌ
์๋์ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ๋ฉ์๋์ ํ์ด์ง๊ณผ ์ ๋ ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
- org.springframework.data.domain.Sort : ์ ๋ ฌ๊ธฐ๋ฅ
- org.springframework.data.domain.Pageable : ํ์ด์ง๊ธฐ๋ฅ(Sort ํฌํจ)
์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ๋ค. ์์ ๋ ํด๋์ค๋ฅผ ํ๋ผ๋ฏธํฐ์ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
Pageable์ ์ฌ์ฉํ๋ฉด ๋ฐํํ์
์ผ๋ก Page๋ฅผ ๋ฐ์ ์ ์๋ค.
ํด๋น ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด์ง๊ณผ ๊ด๋ จ๋ ๋ค์ํญ ์ ๋ณด๋ค์ ์ป์ ์ ์๋ค. ์ฐธ๊ณ ๋ก Page๋ฅผ ๋ฐํํ์
์ผ๋ก ๋ฐ์ผ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ ๊ฑด์๋ฅผ ์กฐํํ๋ count ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ๋ ๋ผ๊ฐ๋ค.
public interface Page<T> extends Slice<T> {
static <T> Page<T> empty() {
return empty(Pageable.unpaged());
}
static <T> Page<T> empty(Pageable pageable) {
return new PageImpl(Collections.emptyList(), pageable, 0L);
}
int getTotalPages();
long getTotalElements();
<U> Page<U> map(Function<? super T, ? extends U> var1);
}
public interface Slice<T> extends Streamable<T> {
int getNumber();
int getSize();
int getNumberOfElements();
List<T> getContent();
boolean hasContent();
Sort getSort();
boolean isFirst();
boolean isLast();
boolean hasNext();
boolean hasPrevious();
default Pageable getPageable() {
return PageRequest.of(this.getNumber(), this.getSize(), this.getSort());
}
Pageable nextPageable();
Pageable previousPageable();
<U> Slice<U> map(Function<? super T, ? extends U> var1);
}
์๋๋ ๊ฐ๋จํ ์ฌ์ฉ ์์ ์ด๋ค.
// Pageable์ interface ์ด๋ฏ๋ก ๊ตฌํ์ฒด์ธ PageRequest ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
// ํ์ด์ง, limit์, Sort ๊ฐ์ฒด๋ฅผ ์ฃผ๋ฉด ๋๋ค
PageRequest pageRequest = PageRequest.of(0, 10, new Sort(Direction.DESC, "name"));
Page<Member> result = memberRepository.findByNameStartingWith("๊น", pageRequest);
result.getContet(); // ์กฐํ๋ ๋ฐ์ดํฐ
result.getTotalPages(); // ์ ์ฒด ํ์ด์ง ์
result.hasNextPage(); // ๋ค์ ํ์ด์ง ์กด์ฌ ์ฌ๋ถ
์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ
- Pageable ๊ฐ์ฒด๋ฅผ Controller parameter๋ก ์ง์ ๋ฐ์์๋ ์๋คpageable ๊ธฐ๋ณธ๊ฐ์ page=0, size=20์ด๋ค.
์ ๋ ฌ์ ์ถ๊ฐํ๊ณ ์ถ์ผ๋ฉด sort ํ๋ผ๋ฏธํฐ๋ฅผ ๊ณ์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. - ํ์ด์ง ์ ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ์ ๋์ฌ๋ฅผ ์ฌ์ฉํด์ ๊ตฌ๋ถํ ์ ์๋ค
//-- ํธ์ถ
//-- /members?page=0&limit=10&sort=name,asc&sort=age,desc
@GetMapping("/members")
public String list(Pageable pageable){
// ...
}
//-- ํธ์ถ
//-- /members?member_page=0&order_page=1
@GetMapping("/members")
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order")Pageable orderPageable){
// ...
}
์ฌ์ฉ์ ์ ์ ๋ ํ์งํ ๋ฆฌ ๊ตฌํ
Spring Data JPA๋ก ๊ฐ๋ฐํ๋ฉด ์ธํฐํ์ด์ค๋ง ์ ์ํ๊ณ ๊ตฌํ์ฒด๋ ๋ง๋ค์ง ์๋๋ฐ, ๋ค์ํ ์ด์ ๋ก ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํด์ผ ํ ๋๋ ์๋ค.
๊ทธ๋ ๋ค๊ณ ๋ ํ์งํ ๋ฆฌ ์์ฒด๋ฅผ ์ง์ ๊ตฌํํ๋ฉด ๊ณตํต ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ๊น์ง ๋ค ๊ตฌํํด์ผ ํ๋ค.
Spring Data JPA๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ฐํํด์ ํ์ํ ๋ฉ์๋๋ง ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- ๋จผ์ ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํ ๋ฉ์๋๋ฅผ ์ํ ์ ์ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ค.
- ์์ ์ฌ์ฉ์์ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
์ด๋ ํด๋์ค ์ด๋ฆ์ ๋ ํ์งํ ๋ฆฌ ์ธํฐํ์ด์ค ์ด๋ฆ + Impl๋ก ์ง์ด์ผํ๋ค.
์ด๋ ๊ฒ ํด์ผ Spring Data JPA๊ฐ ์ฌ์ฉ์ ์ ์ ๊ตฌํ ํด๋์ค๋ก ์ธ์ํ๋ค. - ์ด ํด๋์ค ์ด๋ฆ ๊ท์น์ ๋ณ๊ฒฝํ ์ ์๋ค.
config์ ์ค์ ํ๋ spring data jpa ์ค์ ์ ์์ฑ๊ฐ์ธ repository-impl-postfix ๊ฐ์ ์ง์ ํด์ฃผ๋ฉด ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ Impl ์ด๋ค. - ๋ง์ง๋ง์ผ๋ก ๋ ํ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์์ ์ฌ์ฉ์์ ์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ผ๋ฉด ๋๋ค.
// ์ธํฐํ์ด์ค
public interface MemberRepositoryCustom{
public List<Member> search();
}
// ๊ตฌํ ํด๋์ค
public class MemberRepositoryImpl implements MemberRepositoryCustom{
@Override
public List<Member> search(){
// ....
}
}
// ํด๋์ค ์ด๋ฆ ๊ท์น์ ๋ณ๊ฒฝ
@EnableJpaRepositories(basePackages = "com.joont.repository", repositoryImplementationPostfix = "impl")
// ์ฌ์ฉ์์ ์ ์ธํฐํ์ด์ค๋ฅผ ์์
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom{
}
spring data jpa + QueryDSL
spring์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก QueryDSL์ ์ง์ํ์ง๋ง,
ํ๋๋ ๊ธฐ๋ฅ์ ์กฐ๊ธ ํ๊ณ๊ฐ ์์ด์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด JPAQuery๋ฅผ ์ง์ ์ฌ์ฉํ๊ฑฐ๋ Spring Data JPA๊ฐ ์ ๊ณตํ๋ QueryDslRepositorySupport๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์๋๋ ์ฌ์ฉ ์์ ์ด๋ค.
์ฝ๋๋ฅผ ์ง์ ์จ์ผํ๋ฏ๋ก ์ฌ์ฉ์ ์ ์ ๋ ํ์งํ ๋ฆฌ๋ฅผ ๊ตฌํํด์ผํ๋ค.
public class OrderRepositoryImpl extends QueryDslRepositorySupport implements OrderRepositoryCustom {
public OrderRepositoryImpl() {
super(Order.class);
}
@Override
public List<Order> search(OrderSearch orderSearch, Pageable pa) {
QOrder order = QOrder.order;
QMember member = QMember.member;
JPQLQuery query = from(order);
if (StringUtils.hasText(orderSearch.getMemberName())) {
query.leftJoin(order.member, member)
.where(member.name.contains(orderSearch.getMemberName()));
}
if (orderSearch.getOrderStatus() != null) {
query.where(order.status.eq(orderSearch.getOrderStatus()));
}
return query.list(order);
}
}
QueryDslRepositorySupport ํด๋์ค๋ฅผ ์์๋ฐ์์ ์ฌ์ฉํ๊ณ ์๋ค.
์ฐธ๊ณ ๋ก ์์ฑ์์์ QueryDslRepositorySupport์ ํด๋์ค ์ ๋ณด๋ฅผ ๋๊ฒจ์ค์ผ ํ๋ค.
๊ธฐ์กด์ ์์ฑํ๊ธฐ ๋๋ฆ ๋ฒ๊ฑฐ๋ก์ ๋ JPAQuery, JPAUpdateClause, JPADeleteClause ๋ฑ์ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์๋ค.
์ฐธ๊ณ ๋ก ๋ฐํ์ ์ ๋ถ ์ธํฐํ์ด์ค ํ์
์ธ JPQLQuery, UpdateClause, DeleteClause ๋ฑ์ ๋ฐํํ๋ค.
์ด ์ธ์๋ EntityManager, QueryDSLํฌํผ ๋ฑ์ ๋ฐํํ๋ ๋ฉ์๋๋ ๊ตฌํ๋์ด ์๋ค.
QueryDSL์ Pageable ์ ์ฉํ๊ธฐ
QueryDslRepositorySupport๋ฅผ ์ฌ์ฉํ๋ฉด Spring Data JPA์ Pageable์ ๊ฐ๋จํ๊ฒ ์ ์ฉํ ์ ์๋ค.
Page๋ฅผ ๋ฆฌํดํจ์ผ๋ก์จ ์๋ฒฝํ๊ฒ Pageable์ ์ฌ์ฉํ ์ ์๋ค.
QItem item = QItem.item;
JPQLQuery<Item> query = from(item);
// making condition
query.where(condition).distinct();
long totalCount = query.fetchCount();
List<Item> results = getQuerydsl().applyPagination(pageable, query).fetch();
return new PageImpl<>(results, pageable, totalCount);
ref : https://exhibitlove.tistory.com/262
[JPA] ๊ธฐ๋ณธ์์ฑ findBy.. ํจ์๋ค๊ณผ return๊ฐ
์ถ์ฒ : joont92.github.io/jpa/Spring-Data-JPA/ ์ ์ฌ์ดํธ๊ฐ ๋๋ฌด ์ ๋ฆฌ๋ฅผ ์ ํด ๋์๋ค. ์กฐ๊ธ๋ง ํผ์จ๋ค๋ ๊ฒ์ด ํ๋๋ ๋บ ์ ์๋ ์ฃผ์ฅ๊ฐ์ ๊ธ์ด๋ฏ๋ก ๋๋ฌด ๊ฐ์ฌํ๋ค. JpaRepository(๊ณตํต ์ธํฐํ์ด์ค) JpaRepository
exhibitlove.tistory.com
'Backend๐ฑ > Spring JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ์ฌ์ฉ๋ฒ (JpaRepository) (0) | 2023.04.23 |
---|---|
JPA exists ์ฟผ๋ฆฌ ์ฑ๋ฅ ๊ฐ์ (0) | 2023.04.21 |
[JPA] ์ฟผ๋ฆฌ ๋ฉ์๋ ์ฌ์ฉ (1) | 2023.04.20 |
Spring Data JPA 1. ์์๊ตฌ์กฐ์ ์ฃผ์ ์ธํฐํ์ด์ค (0) | 2023.04.19 |
[JPA] Spring JPA CascadeType ์ข ๋ฅ (0) | 2023.04.09 |