溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring Data JPA分頁復(fù)合查詢的示例分析

發(fā)布時間:2021-07-22 11:33:35 來源:億速云 閱讀:134 作者:小新 欄目:編程語言

這篇文章主要介紹Spring Data JPA分頁復(fù)合查詢的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

Spring Data JPA是Spring Data家族的一部分,可以輕松實(shí)現(xiàn)基于JPA的存儲庫。 此模塊處理對基于JPA的數(shù)據(jù)訪問層的增強(qiáng)支持。 它使構(gòu)建使用數(shù)據(jù)訪問技術(shù)的Spring驅(qū)動應(yīng)用程序變得更加容易。

在相當(dāng)長的一段時間內(nèi),實(shí)現(xiàn)應(yīng)用程序的數(shù)據(jù)訪問層一直很麻煩。 必須編寫太多樣板代碼來執(zhí)行簡單查詢以及執(zhí)行分頁和審計。 Spring Data JPA旨在通過減少實(shí)際需要的工作量來顯著改善數(shù)據(jù)訪問層的實(shí)現(xiàn)。

作為開發(fā)人員,您編寫repository接口,包括自定義查找器方法,Spring將自動提供實(shí)現(xiàn)。例如,你繼承JpaRepository<實(shí)體類,主鍵類型>,他會提供很方便的查詢方法,運(yùn)用findby+字段,完全不需要開發(fā)人員寫sql就可以查詢你需要的。

至于findby的用法可以百度,可以拼接很多關(guān)鍵字來擴(kuò)展。這個是一般情況,但是實(shí)際中可能用的地方就不會這么簡單了,我們來具體說說或者說舉例來說明吧。

一般:就像上面說的,優(yōu)秀。

分頁:分頁其實(shí)說白了就是2個查詢。我們通過使用標(biāo)簽@query內(nèi)含原生態(tài)nativeQuery=ture來手動編寫,列表sql運(yùn)用value,數(shù)量sql用countQuery,返回page屬性。但是注意@query的時候有講究,當(dāng)遇到不同數(shù)據(jù)庫的后面需要拼接的東西不一樣。比如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í)現(xiàn)JpaRepository<實(shí)體類,主鍵類型>和JpaSpecificationExecutor<實(shí)體類>,實(shí)體類還得寫個原型類。service實(shí)現(xiàn)類里面的方法通過findAll((root, criteriaQuery, criteriaBuilder)來構(gòu)造sql。

例:實(shí)體類

@Entity
@Data/**這個是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類就不傳了??聪聅erviceImp這個里面的方法,這個是蛋疼的地方

public List<News> newsList(String type, String creater) {
  return (這個是你注入的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這個包含不止like,還有其他的我就不一一列舉了,具體還有啥建議點(diǎn)進(jìn)去看源碼。但是這樣一看是不是很麻煩。所以實(shí)際運(yùn)用上還是不建議使用。

  總結(jié)一句話,還是老老實(shí)實(shí)用mybatis就好了,mybatis-plus搭配起來就可以寫的很舒暢了。

以上是“Spring Data JPA分頁復(fù)合查詢的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI