Spring Bootシリーズ教程JPAのquery使用姿勢詳細解の基礎編
前のいくつかの文章はそれぞれCURDの中の添削を紹介しました.続いて一番よくある検索編に入ります.jpaを使ってdbの記録調査をする時、どうやって遊ぶことができますか?
このページでは、フィールドクエリー、
I.環境準備
始める前に、もちろん基礎環境を整えておきます.インストールテストはmysqlを使って、SpringBootプロジェクトを作成し、配置情報を設定するなど、構築プロジェクトの詳細については前の記事を参考にしてください. 190612-SpringBootシリーズ教程JPAの基礎環境構築 以下の簡単なデモの追加記録を見てください.必要な構成です.
1.表準備
前編の表をそのまま使用して、構造は以下の通りです.
設定情報は前と少し違っています.もっと詳しいログを追加しました.本編の主な目標は追加記録の使用姿勢に集中しています.配置説明については、後に単独で説明します.
データの修正です.まず表に二つのデータを入れて、後の操作に使います.
簡単な検索操作姿勢の紹介に入ります.単表の簡単なand/or/in/compre検索方式
1.表関連POJO
クエリから返ってきた記録は、エンティティタイプPOJOと紐付けられています.前の分析結果により、次のようになります. である. である. を生成する.
2.Repository API声明
次に、
a.idによる検索
メインキーで調べた以外に、実際のビジネスシーンでは、あるフィールドによって調べられたcaseは、ほとんどいらないです.jpaではどうすればいいですか?は、 である. findByXXXまたはqueryByXXX(ここのxxxはPOJOのメンバー名で置き換えられています.このメンバーによって照会することを表しています.) 簡単なcaseで、nameによるクエリーを実現したいなら、
私達も次の2つの方法(一つのand、一つのorクエリ)を追加できます.
上記の照会方法は等値クエリーであり、sqlでは等値クエリー(すなわち=クエリー)のほかに、各種の比較クエリがあり、検索及びlike文を待たず、jpaでも比較的簡単であり、
inクエリに対して、
数字の比較クエリは、例えば、大なり小なり、以下なり、以下なり、betweenなり、以下の3つの方法によって声明されています.この方法はどのように書けばいいのかを直観的に表現できるはずです. テストのcaseは以下の通りです
並べ替えも基本クエリのcaseに属しています.jpaの実装では、
テストコード
二つの方法があります.一つは最大のデータを調べることです.一つは正常なlimit/offset方式です.次は簡単な例です.
テストcase如
主にjpaの照会の基本的な使い方を紹介しました.主に規則によって方法名を定義する方式でsqlの効果を実現します.
メソッド名
説明
等価sql
私たちがよく使う検索の中には、上記のcase以外にも、以下のようなフォームを使うと、後の文章に紹介されます. 各種関数のサポート(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
このページでは、フィールドクエリー、
and/or/in/like/between
文、デジタル比較、並べ替え、改ページを含む基本的なクエリーの使用姿勢を紹介します.I.環境準備
始める前に、もちろん基礎環境を整えておきます.インストールテストはmysqlを使って、SpringBootプロジェクトを作成し、配置情報を設定するなど、構築プロジェクトの詳細については前の記事を参考にしてください.
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
インターフェースで方法を宣言し、命名規則は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
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の効果を実現します.
メソッド名
説明
等価sql
findByXxx
列Xxx
によって参照構築sqlに等しいことを示す.where xxx= ?
findByXxxAndYyy
複数の列に従ってクエリーを行います.where xxx=? and yyy=?
findByXxxOrYyy
複数の列によるクエリーの実行where xxx=? or yyy=?
findByXxxLike
likeクエリは、クエリ条件の%を追加することに注意する必要があります.where xxx like
findByXxxIn
クエリーwhere Xxx in ()
findByXxxGreaterThan
大きいwhere xxx > ?
findByXxxGreaterThanEqual
大なりイコールwhere xxx >= ?
findByXxxLessThan
以下where xxx < ?
findByXxxLessThanEqual
以下where xxx <= ?
findByXxxNot
等しくないwhere xxx != ?
findByXxxIsBetween
between検索where xxx between ? and ?
OrderByXxxDesc
並べ替えorder by xxx desc
topN
改ページは、一番前のn条を取得することを表します.limit n
また、もう一つの改ページ方法はPageable
を参照して、具体的な改ページを指定することです.私たちがよく使う検索の中には、上記のcase以外にも、以下のようなフォームを使うと、後の文章に紹介されます.
group by
distinct
join
0.ソース&関連ブログ
ソース
本を信じているなら、上記の内容はまったくの家族の話です.個人の能力には限りがありますので、どうしても漏れと間違いがあります.もしバグを発見したら、もっといい提案があります.批判と指摘を歓迎します.感謝の意を表します.
以下は灰色の個人ブログです.勉強と仕事中のブログを記録します.