SpringBootクエリーメソッド機能と@Query


クエリーメソッド機能とJava Persistence Query Languageは、JpaRepositoryが提供するオブジェクト向けクエリーの機能です.複数の検索条件が必要な場合に使用できます.

クエリー方法


メソッド名自体をクエリー構文と見なす機能
主に「findBy」「getBy」で始まる
たとえば、70~80のオブジェクトを取得し、mnoの逆順序でソートする場合は、次の操作を行います.

MemoRepository

//엔티티의 타입정보와 @id타입 지정하기
public interface MemoRepository extends JpaRepository<Memo,Long> {

    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from,Long to);

}

MemoRepositoryTests

    @Test
    public void testQueryMethods(){

        List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L,80L);

        for (Memo memo : list){
            System.out.println(memo);
        }
    }

テスト結果


  • pageableと一緒に処理しますか?
  • MemoRepository

    //엔티티의 타입정보와 @id타입 지정하기
    public interface MemoRepository extends JpaRepository<Memo,Long> {
    
        Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
    
    }

    MemoRepositoryTests

        @Test
        public void testQueryMethodWithPageable(){
    
            Pageable pageable = PageRequest.of(0,10,Sort.by("mno").descending());
    
            Page<Memo> result = memoRepository.findByMnoBetween(10L,50L,pageable);
            
            result.get().forEach(memo -> System.out.println(memo));
        }

    テスト結果



    @Query


    SQLと同様に、エンティティークラスの情報を使用してクエリーを作成する機能
    通常はクエリメソッドのみを使用して単純な処理を行い,@Queryを使用する.
    @QueryのvalueはJPQLによって記述され、通常は「オブジェクト向けクエリー」と呼ばれます.
    @Query(value = "select m from Memo m where m.mno> :mno",
    			countQuery = "select count(m) from Memo m WHERE m.mno > :mno")            
                
    Page<エンティティ>として指定する場合は、countを計算できるクエリーが必要です.
    countQueryを使用してPageableタイプのパラメータを渡すとよい.
    @Query(value = "select * from memo where mno> 0", nativeQuery = true)            
                
    @Queryの強力な機能は、データベース固有のSQL構文を利用することができます.
    複雑なJOIN文などを扱うために使わざるを得ない場合.
    NativeQueryプロパティ値trueを指定し、通常のSQLを使用できます.