JPA Native Query


Native Queryを使いましょう
    @Query(value = "select * from book", nativeQuery = true)
    List<Book> findAllCustom();	//

    @Transactional
    @Modifying
    @Query(value = "update book set category = 'IT전문서'", nativeQuery = true)
    int updateCategories();

    @Query(value = "show tables", nativeQuery = true)
    List<String> showTables();
  • ネイティブクエリでは、JPQLとは異なるEntityプロパティは使用できません.
  • select*from bookのように、テーブル名が含まれています.他のカラム名を記入する場合は、DB Tableで使用するカラム名も記入します.
  •     @Test
        void nativeQueryTest() {
    //        bookRepository.findAll().forEach(System.out::println);
    //        bookRepository.findAllCustom().forEach(System.out::println);
    
            List<Book> books = bookRepository.findAll();
    
            for (Book book : books) {
                book.setCategory("IT전문서");
            }
    
            bookRepository.saveAll(books);
    
            System.out.println(bookRepository.findAll());
    
            System.out.println("affected rows : " + bookRepository.updateCategories());
            bookRepository.findAllCustom().forEach(System.out::println);
    
            System.out.println(bookRepository.showTables());
        }
  • の現業では、本機のクエリーを最小限に抑えることが望ましい.実行中またはテスト中にエラーが発生する可能性があるためです.では、いつネイティブクエリーを使用しますか?
  • の1つ目は、パフォーマンスに問題がある場合に使用することです.deleteAllは、すべてのカラムをクエリーし、削除するパフォーマンスホットスポットをクエリーします.だから出てきたのはdeleteAllInBatchかdeleteInBatchしかしupdateクエリーはありません.だからクエリーごとに更新します.上記のコードの本を次々と「ITプロフェッショナル」カテゴリに貼ると、パフォーマンスの問題が発生します.したがってdeleteAllInBatchのように一度に完了したクエリー(「update book set category=「ITプロフェッショナル」)と言える.この場合、Nativeクエリが役立ちます.
    -重要なのは、DML操作で@Moduffingをupdateクエリとしてマークすることです.
    -交通手段も必要だNativeクエリは@Transactionalを直接宣言する必要があります.
    -ただし@TransactionalはSpringで特定のクラスに対して@Transactionalを行う傾向があります.
  • は、JPAが基本的にサポートしていない機能を使用する場合に使用される.上のリストshowTable()同じ状況でもそうです.では、特殊な形式のクエリーもクエリーできます.