Spring Bootシリーズ教程JPAのquery使用姿勢詳細解の基礎編


前のいくつかの文章はそれぞれCURDの中の添削を紹介しました.続いて一番よくある検索編に入ります.jpaを使ってdbの記録調査をする時、どうやって遊ぶことができますか?
このページでは、フィールドクエリー、and/or/in/like/between文、デジタル比較、並べ替え、改ページを含む基本的なクエリーの使用姿勢を紹介します.
I.環境準備
始める前に、もちろん基礎環境を整えておきます.インストールテストはmysqlを使って、SpringBootプロジェクトを作成し、配置情報を設定するなど、構築プロジェクトの詳細については前の記事を参考にしてください.
  • 190612-SpringBootシリーズ教程JPAの基礎環境構築
  • 以下の簡単なデモの追加記録を見てください.必要な構成です.
    1.表準備
    前編の表をそのまま使用して、構造は以下の通りです.
    CREATE TABLE `money` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL DEFAULT '' COMMENT '   ',
      `money` int(26) NOT NULL DEFAULT '0' COMMENT ' ',
      `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
      `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '    ',
      `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '    ',
      PRIMARY KEY (`id`),
      KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
    2.プロジェクトの設定
    設定情報は前と少し違っています.もっと詳しいログを追加しました.本編の主な目標は追加記録の使用姿勢に集中しています.配置説明については、後に単独で説明します.
    ## DataSource
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.username=root
    spring.datasource.password=
    ## jpa    
    spring.jpa.database=MYSQL
    spring.jpa.hibernate.ddl-auto=none
    spring.jpa.show-sql=true
    spring.jackson.serialization.indent_output=true
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    3.データ準備
    データの修正です.まず表に二つのデータを入れて、後の操作に使います.
    INSERT INTO `money` (`id`, `name`, `money`, `is_deleted`, `create_at`, `update_at`)
    VALUES
        (1, '   blog', 100, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (2, '   2', 200, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (3, '   3', 300, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (4, '   4', 400, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (5, '   5', 500, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (6, 'Batch    blog', 100, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (7, 'Batch    blog 2', 100, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (8, 'Batch     3', 200, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (9, 'Batch     4', 200, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (10, 'batch    5', 1498, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:58'),
        (11, 'batch    6', 1498, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:58'),
        (12, 'batch    7', 400, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
        (13, 'batch    8', 400, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40');
    II.Query基本使用姿勢
    簡単な検索操作姿勢の紹介に入ります.単表の簡単なand/or/in/compre検索方式
    1.表関連POJO
    クエリから返ってきた記録は、エンティティタイプPOJOと紐付けられています.前の分析結果により、次のようになります.
    @Data
    @DynamicUpdate
    @DynamicInsert
    @Entity
    @Table(name = "money")
    public class MoneyPO {
        @Id
        //    auto,      Table 'mysql.hibernate_sequence' doesn't exist
        // @GeneratedValue(strategy = GenerationType.AUTO)
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Integer id;
    
        @Column(name = "name")
        private String name;
    
        @Column(name = "money")
        private Long money;
    
        @Column(name = "is_deleted")
        private Byte isDeleted;
    
        @Column(name = "create_at")
        @CreatedDate
        private Timestamp createAt;
    
        @Column(name = "update_at")
        @CreatedDate
        private Timestamp updateAt;
    
    }
    上記のいくつかの注釈は、次のように説明されています.
  • @Dataは、lombook注釈に属し、jpaに関係なく、自動的にgetter/setter/equals/hashcode/tostringなどの方法を生成する
  • である.
  • @Entity@Table jpa注釈は、このクラスがdbのテーブルと関連していることを示し、具体的に一致しているのはテーブルmoney
  • である.
  • @Id @GeneratedValueとブートキー
  • @Columnは、この属性が表のある列に対応することを示している.
  • @CreateDateは、現在の時間に基づいてデフォルトのタイムスタンプ
  • を生成する.
    2.Repository API声明
    次に、CurdRepositoryからの新しいアプリを作成し、このアプリを通じてデータベースと交渉します.このクラスに多くのクエリ方法を追加します.
    public interface MoneyBaseQueryRepository extends CrudRepository {
    }
    3.姿勢を使う
    a.idによる検索CrudRepositoryが提供した機能は、キーIDに基づいて照会し、使用者にとっては追加の操作が必要なものはなく、直接にアクセスすれば良い.
    private void queryById() {
        //       ,        
        Optional res = moneyCurdRepository.findById(1);
        System.out.println("queryById return: " + res.get());
    }
    b.フィールドによるクエリー
    メインキーで調べた以外に、実際のビジネスシーンでは、あるフィールドによって調べられたcaseは、ほとんどいらないです.jpaではどうすればいいですか?
  • は、Repositoryインターフェースで方法を宣言し、命名規則は
  • である.
  • findByXXXまたはqueryByXXX(ここのxxxはPOJOのメンバー名で置き換えられています.このメンバーによって照会することを表しています.)
  • 簡単なcaseで、nameによるクエリーを実現したいなら、MoneyBaseQueryRepositoryに次の2つの方法のいずれかを追加しても良いです.
    /**
     *        
     *
     * @param name
     * @return
     */
    List findByName(String name);
    
    List queryByName(String name);
    複数のメンバーの照会が必要であれば、簡単に、例えばfindByXxxAndYyyyはsqlのwhere xxxx=? and yyy=?に相当する.
    私達も次の2つの方法(一つのand、一つのorクエリ)を追加できます.
    /**
     *       + money  
     *
     * @param name
     * @param money
     * @return
     */
    List findByNameAndMoney(String name, Long money);
    
    
    /**
     *       or id  
     *
     * @param name
     * @param id
     * @return
     */
    List findByNameOrId(String name, Integer id);
    簡単なテストのcaseは以下の通りです.
    private void queryByField() {
        //           ,          
        String name = "   blog";
        Iterable res = moneyCurdRepository.findByName(name);
        System.out.println("findByName return: " + res);
    
        res = moneyCurdRepository.queryByName(name);
        System.out.println("queryByName return: " + res);
    
        Long money = 100L;
        res = moneyCurdRepository.findByNameAndMoney(name, money);
        System.out.println("findByNameAndMoney return: " + res);
    
        Integer id = 5;
        res = moneyCurdRepository.findByNameOrId(name, id);
        System.out.println("findByNameOrId return: " + res);
    }
    実行後の出力結果は以下の通りです.以下にも対応するsqlが含まれています.分かりやすいです.
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.name=?
    findByName return: [MoneyPO(id=1, name=   blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    --------      -----------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.name=?
    queryByName return: [MoneyPO(id=1, name=   blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    --------      -----------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.name=? and moneypo0_.money=?
    findByNameAndMoney return: [MoneyPO(id=1, name=   blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    --------      -----------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.name=? or moneypo0_.id=?
    findByNameOrId return: [MoneyPO(id=1, name=   blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=5, name=   5, money=500, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    c.likeクエリ
    上記の照会方法は等値クエリーであり、sqlでは等値クエリー(すなわち=クエリー)のほかに、各種の比較クエリがあり、検索及びlike文を待たず、jpaでも比較的簡単であり、repositoryで定義された方法名にlikeを追加すれば良い.
    /**
     * like  
     *
     * @param name
     * @return
     */
    List findByNameLike(String name);
    使う時は、ちょっと注意して、実際の状況によって、%を追加するかどうか決めます.
    private void queryByLike() {
        // like     
        String name = "   %";
        Iterable res = moneyCurdRepository.findByNameLike(name);
        System.out.println("findByName like: " + res);
    }
    出力結果は
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.name like ?
    findByName like: [MoneyPO(id=1, name=   blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=2, name=   2, money=200, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=3, name=   3, money=300, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=4, name=   4, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=5, name=   5, money=500, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    d.inクエリ
    inクエリに対して、CurdRepositoryは、プライマリキーIDに従ったクエリー方式でfindAllByIdを直接呼び出してもよく、他の場合は、一つのインターフェースを宣言することによってサポートされてもよい.
    /**
     * in  
     *
     * @param moneys
     * @return
     */
    List findByMoneyIn(List moneys);
    テストのcaseは以下の通りです
    // in   
    List ids = Arrays.asList(1, 2, 3);
    Iterable res = moneyCurdRepository.findAllById(ids);
    System.out.println("findByIds return: " + res);
    
    res = moneyCurdRepository.findByMoneyIn(Arrays.asList(400L, 300L));
    System.out.println("findByMoneyIn return: " + res);
    出力結果
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.id in (? , ? , ?)
    findByIds return: [MoneyPO(id=1, name=   blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=2, name=   2, money=200, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=3, name=   3, money=300, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    ------      ----------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.money in (? , ?)
    findByMoneyIn return: [MoneyPO(id=3, name=   3, money=300, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=4, name=   4, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=12, name=batch    7, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=13, name=batch    8, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    e.比較クエリ
    数字の比較クエリは、例えば、大なり小なり、以下なり、以下なり、betweenなり、以下の3つの方法によって声明されています.この方法はどのように書けばいいのかを直観的に表現できるはずです.
    /**
     *     or    id     
     *
     * @param id
     * @return
     */
    List findByIdGreaterThanEqual(Integer id);
    
    /**
     *     or    id     
     *
     * @param id
     * @return
     */
    List findByIdLessThanEqual(Integer id);
    
    /**
     * between  
     *
     * @param low
     * @param high
     * @return
     */
    List findByIdIsBetween(Integer low, Integer high);
    以下は簡単なマッピング関係です.
  • >:xxGreaterThan
  • >=:xxGreaterThanEqual
  • <:xxLessThan
  • <=:xxLessThanEqual
  • !=:xxNot
  • between a and b:xxIsBetween
  • テストのcaseは以下の通りです
    private void queryByCompare() {
        Integer id1 = 3;
        Iterable res = moneyCurdRepository.findByIdLessThanEqual(id1);
        System.out.println("findByIdLessThan 3 return: " + res);
    
    
        Integer id2 = 10;
        res = moneyCurdRepository.findByIdGreaterThanEqual(id2);
        System.out.println("findByIdGreaterThan 10 return: " + res);
    
        id1 = 4;
        id2 = 6;
        res = moneyCurdRepository.findByIdIsBetween(id1, id2);
        System.out.println("findByIdsWBetween 3, 10 return: " + res);
    }
    出力結果は
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.id<=?
    findByIdLessThan 3 return: [MoneyPO(id=1, name=   blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=2, name=   2, money=200, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=3, name=   3, money=300, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    ------      ----------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.id>=?
    findByIdGreaterThan 10 return: [MoneyPO(id=10, name=batch    5, money=1498, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), MoneyPO(id=11, name=batch    6, money=1498, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), MoneyPO(id=12, name=batch    7, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=13, name=batch    8, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    ------      ----------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.id between ? and ?
    findByIdsWBetween 3, 10 return: [MoneyPO(id=4, name=   4, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=5, name=   5, money=500, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=6, name=Batch    blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    f.並べ替え
    並べ替えも基本クエリのcaseに属しています.jpaの実装では、OrderByXxxAsc/Descを加えることによって、何に基づいて昇順or降順が決定されますか?
    /**
     *   money  ,         id    
     *
     * @param money
     * @return
     */
    List findByMoneyOrderByIdDesc(Long money);
    
    /**
     *           
     *
     * @param id
     * @return
     */
    List queryByIdGreaterThanEqualOrderByMoneyDescIdAsc(Integer id);
    複数の列に従って並べ替えを行う場合、複数のOrderByを書くのではなく、OrderByの後に直接に対応するxxxAscyyyDescを追加することに注意が必要である.
    テストコード
    private void queryWithSort() {
        //   
        Long money = 400L;
        Iterable res = moneyCurdRepository.findByMoneyOrderByIdDesc(money);
        System.out.println("findByMoneyAndOrderByIdDesc return: " + res);
      
        Integer startId = 7;
        res = moneyCurdRepository.queryByIdGreaterThanEqualOrderByMoneyDescIdAsc(startId);
        System.out.println("queryByIdGreaterThanEqualOrderByMoneyDescIdAsc return: " + res);
    }
    出力結果は以下の通りです
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.money=? order by moneypo0_.id desc
    findByMoneyAndOrderByIdDesc return: [MoneyPO(id=13, name=batch    8, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=12, name=batch    7, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=4, name=   4, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    -------------      --------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.id>=? order by moneypo0_.money desc, moneypo0_.id asc
    queryByIdGreaterThanEqualOrderByMoneyDescIdAsc return: [MoneyPO(id=10, name=batch    5, money=1498, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), MoneyPO(id=11, name=batch    6, money=1498, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), MoneyPO(id=12, name=batch    7, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=13, name=batch    8, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=8, name=Batch     3, money=200, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=9, name=Batch     4, money=200, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=7, name=Batch    blog 2, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    g.改ページクエリ
    二つの方法があります.一つは最大のデータを調べることです.一つは正常なlimit/offset方式です.次は簡単な例です.
    /**
    *     ,        
    *
    * @param id
    * @return
    */
    List findTop3ByIdGreaterThan(Integer id);
    
    /**
    *     
    *
    * @param id
    * @param pageable page  0       0 ,   size   >id     
    * @return
    */
    List findByIdGreaterThan(Integer id, Pageable pageable);
    改ページについては、着信パラメータPageaseによって示されても良いです.
    テストcase如
    private void queryWithPageSize() {
        //     
        Iterable res = moneyCurdRepository.findTop3ByIdGreaterThan(3);
        System.out.println("findTop3ByIdGreaterThan 3 return: " + res);
    
        // id>3, 2 ,  3 ,  id   ,       id=4 + 2 * 3 = 10
        res = moneyCurdRepository.findByIdGreaterThan(3, PageRequest.of(2, 3));
        System.out.println("findByIdGreaterThan 3 pageIndex 2 size 3 return: " + res);
    }
    出力結果は
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.id>? limit ?
    findTop3ByIdGreaterThan 3 return: [MoneyPO(id=4, name=   4, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=5, name=   5, money=500, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), MoneyPO(id=6, name=Batch    blog, money=100, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    ----------      ------------
    Hibernate: select moneypo0_.id as id1_0_, moneypo0_.create_at as create_a2_0_, moneypo0_.is_deleted as is_delet3_0_, moneypo0_.money as money4_0_, moneypo0_.name as name5_0_, moneypo0_.update_at as update_a6_0_ from money moneypo0_ where moneypo0_.id>? limit ?, ?
    findByIdGreaterThan 3 pageIndex 2 size 3 return: [MoneyPO(id=10, name=batch    5, money=1498, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), MoneyPO(id=11, name=batch    6, money=1498, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), MoneyPO(id=12, name=batch    7, money=400, isDeleted=0, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]
    4.まとめ
    主にjpaの照会の基本的な使い方を紹介しました.主に規則によって方法名を定義する方式でsqlの効果を実現します.
    メソッド名
    説明
    等価sqlfindByXxxXxxによって参照構築sqlに等しいことを示す.where xxx= ?findByXxxAndYyy複数の列に従ってクエリーを行います.where xxx=? and yyy=?findByXxxOrYyy複数の列によるクエリーの実行where xxx=? or yyy=?findByXxxLikelikeクエリは、クエリ条件の%を追加することに注意する必要があります.where xxx like findByXxxInクエリーwhere Xxx in ()findByXxxGreaterThan大きいwhere xxx > ?findByXxxGreaterThanEqual大なりイコールwhere xxx >= ?findByXxxLessThan以下where xxx < ?findByXxxLessThanEqual以下where xxx <= ?findByXxxNot等しくないwhere xxx != ?findByXxxIsBetweenbetween検索where xxx between ? and ?OrderByXxxDesc並べ替えorder by xxx desctopN改ページは、一番前のn条を取得することを表します.limit nまた、もう一つの改ページ方法はPageableを参照して、具体的な改ページを指定することです.
    私たちがよく使う検索の中には、上記のcase以外にも、以下のようなフォームを使うと、後の文章に紹介されます.
  • group by
  • distinct
  • join
  • 各種関数のサポート(sum,max,min,avg...)
  • 部分テーブルの一部のフィールドを照会する場合
  • 統計クエリ
  • II.その他
    0.ソース&関連ブログ
    ソース
  • プロジェクト:https://github.com/liuyueyi/spring-boot-demo
  • module:https://github.com/liuyueyi/spring-boot-demo/blob/master/spring-boot/102-jpa
  • 関連ブログ
  • mysqlのロックと事務の詳細
  • Spring学習の事務の使用姿勢
  • Spring学習の事務管理と伝播属性
  • 190612-SpringBootシリーズ教程JPAの基礎環境構築
  • 190614-SpringBootシリーズ教程JPAの新規記録使用姿勢
  • 190623-SpringBootシリーズ教程JPAのudate使用姿勢
  • 190702-SpringBootシリーズ教程JPAのdelete使用姿勢詳細
  • 1.灰色のBlog
    本を信じているなら、上記の内容はまったくの家族の話です.個人の能力には限りがありますので、どうしても漏れと間違いがあります.もしバグを発見したら、もっといい提案があります.批判と指摘を歓迎します.感謝の意を表します.
    以下は灰色の個人ブログです.勉強と仕事中のブログを記録します.
  • 灰色のBlogの個人のブログhttps://blog.hhui.top
  • 灰色のBlog-sppringのテーマのブログhttp://spring.hhui.top