JPA - 2

์ด๋ฆฌยท2022๋…„ 1์›” 19์ผ
0

๐Ÿš€ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

  • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ - selectAllWithPage
    @Test
    public void testPageDefault(){
        Pageable pageable = PageRequest.of(0,10);

        Page<Memo> result = memoRepository.findAll(pageable);
    }
  1. Pageable
  • pageable์€ ์ธํ„ฐํŽ˜์ด์Šค ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด์ธ PageRequest์˜ static ๋ฉ”์„œ๋“œ์ธ of( )์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    • of(int page, int size)
    • of(int page, int size, Sort sort)
  • (0,10)์ด๋ž€ 1ํŽ˜์ด์ง€์˜ 10๊ฐœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (0-indexed)

  • Pageable์„ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” Pageํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


2. findAll( )
  • findAll() : selectAll
  • findAll(Sort sort) : selectAll + order by (asc/desc)
  • findAll(Pageable pageable) : selectAll + limit/count
  • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ limit์™€ count๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ
Hibernate: 
    select
        memo0_.mno as mno1_0_,
        memo0_.memo_text as memo_tex2_0_ 
    from
        tbl_memo memo0_ limit ?
Hibernate: 
    select
        count(memo0_.mno) as col_0_0_ 
    from
        tbl_memo memo0_
  • ๋ฐ˜ํ™˜ ํƒ€์ž…์ด List๊ฐ€ ์•„๋‹ˆ๋ผ Page๋ผ๋Š” ์ 

    • List + ๋ถ€๊ฐ€๊ธฐ๋Šฅ(์•„๋ž˜)


๐Ÿš€ ์ •๋ ฌ ์กฐ๊ฑด ์ถ”๊ฐ€

    @Test
    public void testSort(){
        Sort sort1 = Sort.by("mno").descending();
        Sort sort2 = Sort.by("memoText").ascending();
        Sort sortAll = sort1.and(sort2);

        Pageable pageable = PageRequest.of(0,10, sortAll);

        Page<Memo> result = memoRepository.findAll(pageable);
    }
  1. Sort ์‚ฌ์šฉ๋ฒ•(by, ~scending(), and) ์ฃผ๋ชฉ

  2. ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ of ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ(์œ„์—์„œ ์„ค๋ช…)

  3. ๋กœ๊ทธ

Hibernate: 
    select
        memo0_.mno as mno1_0_,
        memo0_.memo_text as memo_tex2_0_ 
    from
        tbl_memo memo0_ 
    order by
        memo0_.mno desc,
        memo0_.memo_text asc limit ?
Hibernate: 
    select
        count(memo0_.mno) as col_0_0_ 
    from
        tbl_memo memo0_

๐Ÿš€ Query Methods

  • ์ฟผ๋ฆฌ๋ฉ”์„œ๋“œ๋ž€ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ์งˆ์˜๋ฌธ์ด ๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
  • ์œ„์˜ ์˜ˆ์ œ๋“ค์ด JpaRepository๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋ฉฐ, ์ž๋™์™„์„ฑ์œผ๋กœ ๋ณด์ด๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด
  • ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ž€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์žˆ๊ธด ์žˆ์œผ๋ฉด์„œ๋„ ์‚ฌ์‹ค ์—†๋Š” ๋ฉ”์„œ๋“œ๋“ค์„, ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ž˜ ์ง€์–ด์„œ + ์ž˜ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
public interface MemoRepository  extends JpaRepository<Memo,Long> {

    //1
    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from,Long to);
    
    //2
    Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
}
  1. ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ž˜ ์ฐพ๊ฑฐ๋‚˜, ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•œ ์ธํ…”๋ฆฌ์ œ์ด์˜ ์ž๋™์™„์„ฑ์˜ ๋„์›€์„ ๋ฐ›์•„, ๊ทœ์น™์— ๋งž๋Š”(๋ช…๋ช…๋ฒ•, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ํƒ€์ž… ๋“ฑ) ๋ฉ”์„œ๋“œ๋ฅผ ์ž˜ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. Pageable์€ ๋Œ€๋ถ€๋ถ„ ์–ด๋Š ์ฟผ๋ฆฌ๋ฉ”์„œ๋“œ์—๋„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ์กฐ๊ฑด์„ ๋นผ๊ณ , 1->2 ์ฒ˜๋Ÿผ ๋งŒ๋“ ๋‹ค.

  3. sql์ด ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ๋ถˆํŽธํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ„๋‹จํ•œ ์ฒ˜๋ฆฌ๋งŒ ์ฟผ๋ฆฌ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๊ณ , ๋‹ค์Œ ํ† ํ”ฝ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๋‹ค.


๐Ÿš€ @Query, JPQL(๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ)

  • ORM์˜ ๊ฐœ๋…์„ ์ ์šฉํ–ˆ๋‹ค๋Š” ๋Š๋‚Œ์ด ํ™• ๋“ ๋‹ค. (Table -> Class, instance -> row, column -> field)
    @Query("select memo from Memo memo order by memo.mno desc")
    List<Memo> getListDesc();
Hibernate: 
    select
        memo0_.mno as mno1_0_,
        memo0_.memo_text as memo_tex2_0_ 
    from
        tbl_memo memo0_ 
    order by
        memo0_.mno desc

    //ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„๋“œ(์ปฌ๋Ÿผ)์ผ ๋•Œ :xxx ์œผ๋กœ !
    //pageable์„ ์ค˜์„œ ํ• ๊ฑฐ๋ฉด countQuery์†์„ฑ ์ ์šฉ!
    @Query(value = "select memo from Memo memo where memo.mno > :mno", countQuery = "select count(memo) from Memo memo where memo.mno > :mno ")
    Page<Memo> getListWithQuery(Long mno, Pageable pageable);
Hibernate: 
    select
        memo0_.mno as mno1_0_,
        memo0_.memo_text as memo_tex2_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno>? 
    order by
        memo0_.mno desc limit ?

Hibernate: 
    select
        count(memo0_.mno) as col_0_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno>?

    //ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„๋“œ(์ปฌ๋Ÿผ)์ผ ๋•Œ :xxx ์œผ๋กœ !
    //delete, update, insert dml(select ์ œ์™ธ)๋Š” ๋‘ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.
    @Query("update Memo memo set memo.memoText = :memoText where memo.mno = :mno")
    @Transactional
    @Modifying
    int updateMemoText(@Param("mno") Long mno, @Param("memoText") String memoText);
Hibernate: 
    update
        tbl_memo 
    set
        memo_text=? 
    where
        mno=?

    //ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ์ฒด(์—”ํ‹ฐํ‹ฐ)์ผ ๋•Œ : :#{} ์œผ๋กœ !
    @Query("update Memo memo set memo.memoText = :#{#param.memoText} where memo.mno = :#{#param.mno}")
    @Transactional
    @Modifying
    int updateMemoText(@Param("param") Memo memo );
Hibernate: 
    update
        tbl_memo 
    set
        memo_text=? 
    where
        mno=?

    //JPQL์˜ ์žฅ์ ์€ Object๋„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Œ
    //๋‚˜์ค‘์— ์กฐ์ธ ๋“ฑ์œผ๋กœ ์ ๋‹นํ•œ ์—”ํ‹ฐํ‹ฐํƒ€์ž…์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—
    @Query("select memo.mno, memo.memoText, current_date from  Memo memo where memo.mno > :mno")
    List<Object[]> getListWithQueryObject(Long mno);
Hibernate: 
    select
        memo0_.mno as col_0_0_,
        memo0_.memo_text as col_1_0_,
        current_date as col_2_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno>?

    //์–ด์ฉ” ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  Native SQL๋„ ์žˆ์œผ๋ฉฐ, nativeQuery๋ฅผ true๋กœ ๋†“๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.
    @Query(value="select * from tbl_memo where mno > 0", nativeQuery = true)
    List<Object[]> getNativeResult();
Hibernate: 
    select
        * 
    from
        tbl_memo 
    where
        mno > 0

profile
์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์‚ฌ๋žŒ์ด ๋˜์ž

0๊ฐœ์˜ ๋Œ“๊ธ€