Spring Data JPA分頁(yè)復(fù)合查詢?cè)斫馕?/h1>
更新時(shí)間:2019年11月20日 09:47:12 作者:lannoy
這篇文章主要介紹了Spring Data JPA分頁(yè)復(fù)合查詢?cè)斫馕?文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
Spring Data JPA是Spring Data家族的一部分,可以輕松實(shí)現(xiàn)基于JPA的存儲(chǔ)庫(kù)。 此模塊處理對(duì)基于JPA的數(shù)據(jù)訪問層的增強(qiáng)支持。 它使構(gòu)建使用數(shù)據(jù)訪問技術(shù)的Spring驅(qū)動(dòng)應(yīng)用程序變得更加容易。
在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi),實(shí)現(xiàn)應(yīng)用程序的數(shù)據(jù)訪問層一直很麻煩。 必須編寫太多樣板代碼來執(zhí)行簡(jiǎn)單查詢以及執(zhí)行分頁(yè)和審計(jì)。 Spring Data JPA旨在通過減少實(shí)際需要的工作量來顯著改善數(shù)據(jù)訪問層的實(shí)現(xiàn)。
作為開發(fā)人員,您編寫repository接口,包括自定義查找器方法,Spring將自動(dòng)提供實(shí)現(xiàn)。例如,你繼承JpaRepository<實(shí)體類,主鍵類型>,他會(huì)提供很方便的查詢方法,運(yùn)用findby+字段,完全不需要開發(fā)人員寫sql就可以查詢你需要的。
至于findby的用法可以百度,可以拼接很多關(guān)鍵字來擴(kuò)展。這個(gè)是一般情況,但是實(shí)際中可能用的地方就不會(huì)這么簡(jiǎn)單了,我們來具體說說或者說舉例來說明吧。
一般:就像上面說的,優(yōu)秀。
分頁(yè):分頁(yè)其實(shí)說白了就是2個(gè)查詢。我們通過使用標(biāo)簽@query內(nèi)含原生態(tài)nativeQuery=ture來手動(dòng)編寫,列表sql運(yùn)用value,數(shù)量sql用countQuery,返回page屬性。但是注意@query的時(shí)候有講究,當(dāng)遇到不同數(shù)據(jù)庫(kù)的后面需要拼接的東西不一樣。比如orcale是?#{#pageable},mysql是 \n#pageable\n ,sqlsever是 \n-- #pageable\n 。
例:
@Query(value="select * from C_Article where type=:type \n--#pageable\n",countQuery="select count(*) from C_Article where type=:type",nativeQuery=true)
Page<C_Article> findByType(@Param("type") String type,Pageable pageable);
所以總結(jié)來說還是比較蛋疼,而且還沒說其他復(fù)合情況。
復(fù)合查詢:一般的復(fù)合我們可以用原生態(tài)的sql解決,即nativeQuery=ture。當(dāng)遇到條件拼接查詢的時(shí)候我第一次就傻掉了。查了好久,沒找到感覺舒適的。他需要我們實(shí)現(xiàn)JpaRepository<實(shí)體類,主鍵類型>和JpaSpecificationExecutor<實(shí)體類>,實(shí)體類還得寫個(gè)原型類。service實(shí)現(xiàn)類里面的方法通過findAll((root, criteriaQuery, criteriaBuilder)來構(gòu)造sql。
例:實(shí)體類
@Entity
@Data/**這個(gè)是lombok標(biāo)簽**/
@Table(name="news")
public class News implements Serializable{
@Id
private String Id;
private String Type;
private String Title;
private String Creater;
}
模型類
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(News.class)
public class News_ {
public static volatile SingularAttribute<News, String> Id;
public static volatile SingularAttribute<News, String> Type;
public static volatile SingularAttribute<News, String> Title;
public static volatile SingularAttribute<News, String> Creater;
}
service類就不傳了。看下serviceImp這個(gè)里面的方法,這個(gè)是蛋疼的地方
public List<News> newsList(String type, String creater) {
return (這個(gè)是你注入的repository)repository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicatesList = new ArrayList<>();
if (creater!="" ) {
predicatesList.add(
criteriaBuilder.and(
criteriaBuilder.like(
root.get(News_.Creater), "%" + creater+ "%")));
}
if (type!="") {
predicatesList.add(
criteriaBuilder.and(
criteriaBuilder.like(
root.get(News_.Type), "%"+type+"%")));
}
return criteriaBuilder.and(
predicatesList.toArray(new Predicate[predicatesList.size()]));
});
}
DAO類
public interface NewsRepository extends JpaRepository<News, String>,JpaSpecificationExecutor<News>{
List<News> <em id="__mceDel">newsList(String type,String create)</em>
}
criteriaBuilder這個(gè)包含不止like,還有其他的我就不一一列舉了,具體還有啥建議點(diǎn)進(jìn)去看源碼。但是這樣一看是不是很麻煩。所以實(shí)際運(yùn)用上還是不建議使用。
總結(jié)一句話,還是老老實(shí)實(shí)用mybatis就好了,mybatis-plus搭配起來就可以寫的很舒暢了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
-
SpringSecurity Jwt Token 自動(dòng)刷新的實(shí)現(xiàn)
這篇文章主要介紹了SpringSecurity Jwt Token 自動(dòng)刷新的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2020-06-06
-
Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)
這篇文章主要介紹了Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下 2021-03-03
-
SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解
這篇文章主要介紹了SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下 2020-05-05
-
JAVA多線程處理for循環(huán)數(shù)據(jù)詳細(xì)講解
這篇文章主要給大家介紹了關(guān)于JAVA多線程處理for循環(huán)數(shù)據(jù)的相關(guān)資料,我們?cè)诖a中經(jīng)常需要使用for循環(huán)這個(gè)操作來達(dá)到目的,而當(dāng)for循環(huán)的次數(shù)過多時(shí)我們會(huì)發(fā)現(xiàn)執(zhí)行效率會(huì)變的很低,整體耗時(shí)非常多,需要的朋友可以參考下 2023-07-07
-
Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問題
這篇文章主要介紹了Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2022-06-06
最新評(píng)論
Spring Data JPA是Spring Data家族的一部分,可以輕松實(shí)現(xiàn)基于JPA的存儲(chǔ)庫(kù)。 此模塊處理對(duì)基于JPA的數(shù)據(jù)訪問層的增強(qiáng)支持。 它使構(gòu)建使用數(shù)據(jù)訪問技術(shù)的Spring驅(qū)動(dòng)應(yīng)用程序變得更加容易。
在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi),實(shí)現(xiàn)應(yīng)用程序的數(shù)據(jù)訪問層一直很麻煩。 必須編寫太多樣板代碼來執(zhí)行簡(jiǎn)單查詢以及執(zhí)行分頁(yè)和審計(jì)。 Spring Data JPA旨在通過減少實(shí)際需要的工作量來顯著改善數(shù)據(jù)訪問層的實(shí)現(xiàn)。
作為開發(fā)人員,您編寫repository接口,包括自定義查找器方法,Spring將自動(dòng)提供實(shí)現(xiàn)。例如,你繼承JpaRepository<實(shí)體類,主鍵類型>,他會(huì)提供很方便的查詢方法,運(yùn)用findby+字段,完全不需要開發(fā)人員寫sql就可以查詢你需要的。
至于findby的用法可以百度,可以拼接很多關(guān)鍵字來擴(kuò)展。這個(gè)是一般情況,但是實(shí)際中可能用的地方就不會(huì)這么簡(jiǎn)單了,我們來具體說說或者說舉例來說明吧。
一般:就像上面說的,優(yōu)秀。
分頁(yè):分頁(yè)其實(shí)說白了就是2個(gè)查詢。我們通過使用標(biāo)簽@query內(nèi)含原生態(tài)nativeQuery=ture來手動(dòng)編寫,列表sql運(yùn)用value,數(shù)量sql用countQuery,返回page屬性。但是注意@query的時(shí)候有講究,當(dāng)遇到不同數(shù)據(jù)庫(kù)的后面需要拼接的東西不一樣。比如orcale是?#{#pageable},mysql是 \n#pageable\n ,sqlsever是 \n-- #pageable\n 。
例:
@Query(value="select * from C_Article where type=:type \n--#pageable\n",countQuery="select count(*) from C_Article where type=:type",nativeQuery=true) Page<C_Article> findByType(@Param("type") String type,Pageable pageable);
所以總結(jié)來說還是比較蛋疼,而且還沒說其他復(fù)合情況。
復(fù)合查詢:一般的復(fù)合我們可以用原生態(tài)的sql解決,即nativeQuery=ture。當(dāng)遇到條件拼接查詢的時(shí)候我第一次就傻掉了。查了好久,沒找到感覺舒適的。他需要我們實(shí)現(xiàn)JpaRepository<實(shí)體類,主鍵類型>和JpaSpecificationExecutor<實(shí)體類>,實(shí)體類還得寫個(gè)原型類。service實(shí)現(xiàn)類里面的方法通過findAll((root, criteriaQuery, criteriaBuilder)來構(gòu)造sql。
例:實(shí)體類
@Entity @Data/**這個(gè)是lombok標(biāo)簽**/ @Table(name="news") public class News implements Serializable{ @Id private String Id; private String Type; private String Title; private String Creater; }
模型類
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel(News.class) public class News_ { public static volatile SingularAttribute<News, String> Id; public static volatile SingularAttribute<News, String> Type; public static volatile SingularAttribute<News, String> Title; public static volatile SingularAttribute<News, String> Creater; }
service類就不傳了。看下serviceImp這個(gè)里面的方法,這個(gè)是蛋疼的地方
public List<News> newsList(String type, String creater) { return (這個(gè)是你注入的repository)repository.findAll((root, criteriaQuery, criteriaBuilder) -> { List<Predicate> predicatesList = new ArrayList<>(); if (creater!="" ) { predicatesList.add( criteriaBuilder.and( criteriaBuilder.like( root.get(News_.Creater), "%" + creater+ "%"))); } if (type!="") { predicatesList.add( criteriaBuilder.and( criteriaBuilder.like( root.get(News_.Type), "%"+type+"%"))); } return criteriaBuilder.and( predicatesList.toArray(new Predicate[predicatesList.size()])); }); }
DAO類
public interface NewsRepository extends JpaRepository<News, String>,JpaSpecificationExecutor<News>{ List<News> <em id="__mceDel">newsList(String type,String create)</em> }
criteriaBuilder這個(gè)包含不止like,還有其他的我就不一一列舉了,具體還有啥建議點(diǎn)進(jìn)去看源碼。但是這樣一看是不是很麻煩。所以實(shí)際運(yùn)用上還是不建議使用。
總結(jié)一句話,還是老老實(shí)實(shí)用mybatis就好了,mybatis-plus搭配起來就可以寫的很舒暢了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringSecurity Jwt Token 自動(dòng)刷新的實(shí)現(xiàn)
這篇文章主要介紹了SpringSecurity Jwt Token 自動(dòng)刷新的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)
這篇文章主要介紹了Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解
這篇文章主要介紹了SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05JAVA多線程處理for循環(huán)數(shù)據(jù)詳細(xì)講解
這篇文章主要給大家介紹了關(guān)于JAVA多線程處理for循環(huán)數(shù)據(jù)的相關(guān)資料,我們?cè)诖a中經(jīng)常需要使用for循環(huán)這個(gè)操作來達(dá)到目的,而當(dāng)for循環(huán)的次數(shù)過多時(shí)我們會(huì)發(fā)現(xiàn)執(zhí)行效率會(huì)變的很低,整體耗時(shí)非常多,需要的朋友可以參考下2023-07-07Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問題
這篇文章主要介紹了Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06