使用Spring Data Jpa查詢?nèi)坎⑴判?/h1>
更新時(shí)間:2021年11月20日 11:24:32 作者:yogima
這篇文章主要介紹了使用Spring Data Jpa查詢?nèi)坎⑴判?,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
Spring Data Jpa查詢?nèi)坎⑴判?/h2>
1、Repository層只需要簡(jiǎn)單地extends JpaRepository
依舊不用寫任何東西。因?yàn)樗约浩鋵?shí)有一個(gè)findAll(Sort sort)的方法,直接用就可以了。
2、Service層中如下
List<xxxDO> xxxDOS = xxxRepository.findAll(new Sort(Sort.Direction.ASC,"屬性名"));
但注意springboot2.2.1及以上的版本Sort的構(gòu)造方法變?yōu)樗接校枰裣旅孢@樣寫:
List<xxxDO> xxxDOS = xxxRepository.findAll(Sort.by(Sort.Direction.ASC,"屬性名"));
JPA之排序問題
1、總覽
本文將要探討的是用于Java Persistence API(JPA)排序的各種實(shí)現(xiàn)方式,它們適用于簡(jiǎn)單實(shí)體以及一對(duì)多關(guān)系中的實(shí)體。這些方法將排序工作的負(fù)擔(dān)委托給數(shù)據(jù)庫層。
2、使用JPA / JQL API排序
通過使用Order By關(guān)鍵詞實(shí)現(xiàn)JQL排序:
String jql ="Select * from Student order by id";
Query query = entityManager.createQuery (jql);
基于上面的查詢,JPA生成如下簡(jiǎn)單的SQL語句:
Hibernate: select * from Student order by id
注:JQL字符串中的SQL關(guān)鍵字不區(qū)分大小寫,但是實(shí)體的名稱及其屬性是區(qū)分的(實(shí)體:Student、屬性:id)。
2.1、設(shè)置排序順序
默認(rèn)情況下,排序順序是升序的,但是可以在JQL字符串中顯式設(shè)置。就像在純SQL中一樣,排序選項(xiàng)是asc和desc:
String jql = "Select * from Student order by id desc";
Query sortQuery = entityManager.createQuery(jql);
其生成的SQL查詢將會(huì)包括排序的升降方向:
Hibernate: select * from Student order by id desc
2.2、按兩個(gè)及以上的屬性個(gè)數(shù)排序
為了按多個(gè)屬性排序,會(huì)將需要排序的屬性都添加到JQL字符串的order by子句中:
String jql="Select * from Student Order by name asc,id desc";
Query sortQuery = entityManager.createQuery(jql);
同樣的排序條件將會(huì)出現(xiàn)在生成的SQL查詢語句中:
Hibernate: select * from Student order by name asc,id desc
注:對(duì)于多屬性排序,優(yōu)先排第一個(gè)屬性,當(dāng)?shù)谝粋€(gè)值相同時(shí)在按照第二個(gè)屬性進(jìn)行排序,以此類推。
2.3、設(shè)置空值的排序優(yōu)先級(jí)
默認(rèn)的空值優(yōu)先級(jí)是在數(shù)據(jù)庫中特定了的,但這可以通過HQL查詢字符串中的NULLS FIRST或NULLS LAST子句進(jìn)行自定義。
舉一個(gè)簡(jiǎn)單的示例–按Student的name屬性降序排列,并將Nulls放在末尾:
Query sortQuery = entityManager.createQuery
("Select * from Student order by name desc NULLS LAST");
那么,其生成的SQL查詢將是如下情況:
Hibernate: select * from Student order by case when name is null then 1 else 0 end, desc
2.4、一對(duì)多關(guān)系排序
超越基本示例,現(xiàn)在看一個(gè)用例,該用例涉及以一對(duì)多關(guān)系對(duì)實(shí)體進(jìn)行排序– Bar包含Student實(shí)體的集合。我們要對(duì)Bar實(shí)體及其Student實(shí)體的集合進(jìn)行排序-JPA對(duì)于此任務(wù)特別簡(jiǎn)單:
1、對(duì)集合進(jìn)行排序:在Bar實(shí)體的Student集合上添加一個(gè)@OrderBy注解:
@OrderBy("name ASC")
List <Student> studentList;
2、對(duì)包含集合的實(shí)體進(jìn)行排序:
String jql = "Select * from Bar as b order by b.id";
Query barQuery = entityManager.createQuery(jql);
List<Bar> barList = barQuery.getResultList();
注:此處使用了@OrderBy注解的原因是:我們要對(duì)每個(gè)Bar的Student集合進(jìn)行排序。
接下來看一下以上JQL對(duì)應(yīng)的SQL語句吧:
Hibernate: select * from Bar b order by b.id
Hibernate:
select * from Student slist where slist.bar_id=? order by slist.name asc
第一個(gè)查詢對(duì)父Bar實(shí)體進(jìn)行排序。生成第二個(gè)查詢以對(duì)屬于Bar的子Student實(shí)體的集合進(jìn)行排序。
3、使用JPA條件查詢對(duì)象API進(jìn)行排序
使用JPA Criteria – orderBy方法是設(shè)置所有排序參數(shù)的“一站式”選擇:可以設(shè)置排序方向和排序依據(jù)。以下是該方法的API:
orderBy(CriteriaBuilder.asc):升序排序。 orderBy (CriteriaBuilder.desc): 降序排序。
每個(gè)Order實(shí)例都是通過CriteriaBuilder對(duì)象的asc或desc方法創(chuàng)建的.
這是一個(gè)簡(jiǎn)單的示例-按名稱對(duì)Student進(jìn)行排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
Root<Student> from = criteriaQuery.from(Student.class);
CriteriaQuery<Student> select = criteriaQuery.select(from);
criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")));
get方法的參數(shù)區(qū)分大小寫,因?yàn)樗枰c屬性名稱匹配。
與簡(jiǎn)單的JQL相反,JPA條件查詢對(duì)象API會(huì)在查詢中強(qiáng)制使用明確的順序方向。注意,在此代碼片段的最后一行中,criteriaBuilder對(duì)象通過調(diào)用其asc方法指定了升序排列。
執(zhí)行上述代碼后,JPA會(huì)生成如下所示的SQL查詢。 JPA Criteria Object生成帶有顯式asc子句的SQL語句:
Hibernate: select * from Student order by asc
3.1、按兩個(gè)及以上的屬性個(gè)數(shù)排序
要對(duì)多個(gè)屬性進(jìn)行排序,只需將Order實(shí)例傳遞給orderBy方法,以對(duì)每個(gè)屬性進(jìn)行排序。 這是一個(gè)簡(jiǎn)單的示例-按名稱和ID分別按升序和降序排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
Root<Student> from = criteriaQuery.from(Student.class);
CriteriaQuery<Student> select = criteriaQuery.select(from);
criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")),
criteriaBuilder.desc(from.get("id")));
相應(yīng)的SQL查詢?nèi)缦滤荆?/p>
Hibernate: select * from Student order by name asc,id desc
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
SpringBoot詳解整合Spring?Cache實(shí)現(xiàn)Redis緩存流程
這篇文章主要介紹了SpringBoot整合Spring?Cache實(shí)現(xiàn)Redis緩存方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2022-07-07
-
Spring事務(wù)失效場(chǎng)景原理及解決方案
這篇文章主要介紹了Spring事務(wù)失效場(chǎng)景原理及解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下 2020-09-09
-
Java數(shù)據(jù)結(jié)構(gòu)之順序表的實(shí)現(xiàn)
線性表(linear?list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。?線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),本文將用Java實(shí)現(xiàn)順序表,感興趣的可以了解一下 2022-09-09
-
spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解
這篇文章主要介紹了spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2020-07-07
-
Java異常處理Guava?Throwables類使用實(shí)例解析
這篇文章主要為大家介紹了Java異常處理神器Guava?Throwables類使用深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2023-12-12
-
MyBatis-Plus找不到Mapper.xml文件的幾種解決方法
mybatis-plus今天遇到一個(gè)問題,就是mybatis 沒有讀取到mapper.xml 文件,所以下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus找不到Mapper.xml文件的幾種解決方法,需要的朋友可以參考下 2022-06-06
-
SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式
這篇文章主要介紹了SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2021-08-08
最新評(píng)論
Spring Data Jpa查詢?nèi)坎⑴判?/h2>
1、Repository層只需要簡(jiǎn)單地extends JpaRepository
依舊不用寫任何東西。因?yàn)樗约浩鋵?shí)有一個(gè)findAll(Sort sort)的方法,直接用就可以了。
2、Service層中如下
List<xxxDO> xxxDOS = xxxRepository.findAll(new Sort(Sort.Direction.ASC,"屬性名"));
但注意springboot2.2.1及以上的版本Sort的構(gòu)造方法變?yōu)樗接校枰裣旅孢@樣寫:
List<xxxDO> xxxDOS = xxxRepository.findAll(Sort.by(Sort.Direction.ASC,"屬性名"));
JPA之排序問題
1、總覽
本文將要探討的是用于Java Persistence API(JPA)排序的各種實(shí)現(xiàn)方式,它們適用于簡(jiǎn)單實(shí)體以及一對(duì)多關(guān)系中的實(shí)體。這些方法將排序工作的負(fù)擔(dān)委托給數(shù)據(jù)庫層。
2、使用JPA / JQL API排序
通過使用Order By關(guān)鍵詞實(shí)現(xiàn)JQL排序:
String jql ="Select * from Student order by id"; Query query = entityManager.createQuery (jql);
基于上面的查詢,JPA生成如下簡(jiǎn)單的SQL語句:
Hibernate: select * from Student order by id
注:JQL字符串中的SQL關(guān)鍵字不區(qū)分大小寫,但是實(shí)體的名稱及其屬性是區(qū)分的(實(shí)體:Student、屬性:id)。
2.1、設(shè)置排序順序
默認(rèn)情況下,排序順序是升序的,但是可以在JQL字符串中顯式設(shè)置。就像在純SQL中一樣,排序選項(xiàng)是asc和desc:
String jql = "Select * from Student order by id desc"; Query sortQuery = entityManager.createQuery(jql);
其生成的SQL查詢將會(huì)包括排序的升降方向:
Hibernate: select * from Student order by id desc
2.2、按兩個(gè)及以上的屬性個(gè)數(shù)排序
為了按多個(gè)屬性排序,會(huì)將需要排序的屬性都添加到JQL字符串的order by子句中:
String jql="Select * from Student Order by name asc,id desc"; Query sortQuery = entityManager.createQuery(jql);
同樣的排序條件將會(huì)出現(xiàn)在生成的SQL查詢語句中:
Hibernate: select * from Student order by name asc,id desc
注:對(duì)于多屬性排序,優(yōu)先排第一個(gè)屬性,當(dāng)?shù)谝粋€(gè)值相同時(shí)在按照第二個(gè)屬性進(jìn)行排序,以此類推。
2.3、設(shè)置空值的排序優(yōu)先級(jí)
默認(rèn)的空值優(yōu)先級(jí)是在數(shù)據(jù)庫中特定了的,但這可以通過HQL查詢字符串中的NULLS FIRST或NULLS LAST子句進(jìn)行自定義。
舉一個(gè)簡(jiǎn)單的示例–按Student的name屬性降序排列,并將Nulls放在末尾:
Query sortQuery = entityManager.createQuery
("Select * from Student order by name desc NULLS LAST");
那么,其生成的SQL查詢將是如下情況:
Hibernate: select * from Student order by case when name is null then 1 else 0 end, desc
2.4、一對(duì)多關(guān)系排序
超越基本示例,現(xiàn)在看一個(gè)用例,該用例涉及以一對(duì)多關(guān)系對(duì)實(shí)體進(jìn)行排序– Bar包含Student實(shí)體的集合。我們要對(duì)Bar實(shí)體及其Student實(shí)體的集合進(jìn)行排序-JPA對(duì)于此任務(wù)特別簡(jiǎn)單:
1、對(duì)集合進(jìn)行排序:在Bar實(shí)體的Student集合上添加一個(gè)@OrderBy注解:
@OrderBy("name ASC")
List <Student> studentList;
2、對(duì)包含集合的實(shí)體進(jìn)行排序:
String jql = "Select * from Bar as b order by b.id"; Query barQuery = entityManager.createQuery(jql); List<Bar> barList = barQuery.getResultList();
注:此處使用了@OrderBy注解的原因是:我們要對(duì)每個(gè)Bar的Student集合進(jìn)行排序。
接下來看一下以上JQL對(duì)應(yīng)的SQL語句吧:
Hibernate: select * from Bar b order by b.id Hibernate: select * from Student slist where slist.bar_id=? order by slist.name asc
第一個(gè)查詢對(duì)父Bar實(shí)體進(jìn)行排序。生成第二個(gè)查詢以對(duì)屬于Bar的子Student實(shí)體的集合進(jìn)行排序。
3、使用JPA條件查詢對(duì)象API進(jìn)行排序
使用JPA Criteria – orderBy方法是設(shè)置所有排序參數(shù)的“一站式”選擇:可以設(shè)置排序方向和排序依據(jù)。以下是該方法的API:
orderBy(CriteriaBuilder.asc):升序排序。 orderBy (CriteriaBuilder.desc): 降序排序。
每個(gè)Order實(shí)例都是通過CriteriaBuilder對(duì)象的asc或desc方法創(chuàng)建的.
這是一個(gè)簡(jiǎn)單的示例-按名稱對(duì)Student進(jìn)行排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
Root<Student> from = criteriaQuery.from(Student.class);
CriteriaQuery<Student> select = criteriaQuery.select(from);
criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")));
get方法的參數(shù)區(qū)分大小寫,因?yàn)樗枰c屬性名稱匹配。
與簡(jiǎn)單的JQL相反,JPA條件查詢對(duì)象API會(huì)在查詢中強(qiáng)制使用明確的順序方向。注意,在此代碼片段的最后一行中,criteriaBuilder對(duì)象通過調(diào)用其asc方法指定了升序排列。
執(zhí)行上述代碼后,JPA會(huì)生成如下所示的SQL查詢。 JPA Criteria Object生成帶有顯式asc子句的SQL語句:
Hibernate: select * from Student order by asc
3.1、按兩個(gè)及以上的屬性個(gè)數(shù)排序
要對(duì)多個(gè)屬性進(jìn)行排序,只需將Order實(shí)例傳遞給orderBy方法,以對(duì)每個(gè)屬性進(jìn)行排序。 這是一個(gè)簡(jiǎn)單的示例-按名稱和ID分別按升序和降序排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
Root<Student> from = criteriaQuery.from(Student.class);
CriteriaQuery<Student> select = criteriaQuery.select(from);
criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")),
criteriaBuilder.desc(from.get("id")));
相應(yīng)的SQL查詢?nèi)缦滤荆?/p>
Hibernate: select * from Student order by name asc,id desc
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot詳解整合Spring?Cache實(shí)現(xiàn)Redis緩存流程
這篇文章主要介紹了SpringBoot整合Spring?Cache實(shí)現(xiàn)Redis緩存方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Spring事務(wù)失效場(chǎng)景原理及解決方案
這篇文章主要介紹了Spring事務(wù)失效場(chǎng)景原理及解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Java數(shù)據(jù)結(jié)構(gòu)之順序表的實(shí)現(xiàn)
線性表(linear?list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。?線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),本文將用Java實(shí)現(xiàn)順序表,感興趣的可以了解一下2022-09-09
spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解
這篇文章主要介紹了spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java異常處理Guava?Throwables類使用實(shí)例解析
這篇文章主要為大家介紹了Java異常處理神器Guava?Throwables類使用深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
MyBatis-Plus找不到Mapper.xml文件的幾種解決方法
mybatis-plus今天遇到一個(gè)問題,就是mybatis 沒有讀取到mapper.xml 文件,所以下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus找不到Mapper.xml文件的幾種解決方法,需要的朋友可以參考下2022-06-06
SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式
這篇文章主要介紹了SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

