国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

告別SQL查詢煩惱!Spring Boot 強(qiáng)大的六種查詢模式

數(shù)據(jù)庫 其他數(shù)據(jù)庫
Spring Data JPA支持通過方法名定義查詢,遵循命名約定(如findBy、And、Or等)自動生成JPQL查詢語句,無需手動編寫SQL,簡化數(shù)據(jù)訪問層開發(fā),提升編碼效率與可讀性。

環(huán)境:SpringBoot3.4.2

1. 簡介

Spring Data JPA作為Spring生態(tài)中簡化數(shù)據(jù)訪問的核心組件,通過抽象JPA規(guī)范降低了持久層開發(fā)復(fù)雜度。其查詢模式覆蓋從快速原型開發(fā)到復(fù)雜業(yè)務(wù)場景的全生命周期需求:

  • 方法名派生查詢適合簡單條件檢索,如用戶狀態(tài)過濾
  • @Query注解支持原生SQL與JPQL,可處理跨庫聯(lián)表查詢或數(shù)據(jù)庫特定優(yōu)化
  • JPA Criteria API與Specification接口則通過動態(tài)條件構(gòu)建,滿足那些多維度篩選高靈活性場景

分頁排序與事務(wù)管理集成進(jìn)一步強(qiáng)化了其在企業(yè)級應(yīng)用中的實用性。

本篇文章將為你詳細(xì)介紹6種強(qiáng)大的查詢模式。

2.實戰(zhàn)案例

2.1 派生查詢(基于方法名)

Spring Data JPA支持通過方法名定義查詢,遵循命名約定(如findBy、And、Or等)自動生成JPQL查詢語句,無需手動編寫SQL,簡化數(shù)據(jù)訪問層開發(fā),提升編碼效率與可讀性,如下示例:

public interface BookRepository extends JpaRepository<Book, Long> {


  Optional<Book> findByTitle(String title) ;


  List<Book> findByPriceGreaterThan(BigDecimal price);
}

? 可讀性強(qiáng)且易于維護(hù)。

?? 不適用于復(fù)雜的聯(lián)接或篩選條件。

?? 專業(yè)提示:對于簡單的增刪改查(CRUD)操作或簡單篩選條件,使用派生查詢。不要在業(yè)務(wù)邏輯中過度使用它們。

如下列出了支持的查詢方法謂詞關(guān)鍵字和修飾符:

圖片圖片

2.2 JPQL查詢

JPQL(Java Persistence Query Language)是JPA的查詢語言,基于實體類及其屬性進(jìn)行面向?qū)ο蟛樵儯С諷ELECT、UPDATE、DELETE操作,通過@Query注解或EntityManager執(zhí)行,屏蔽底層數(shù)據(jù)庫差異,提升可移植性,如下示例:

@Query("SELECT u FROM Book u WHERE u.price > :status AND u.title LIKE %:keyword%")
List<Book> findBooks(@Param("price") BigDecimal price, 
    @Param("keyword") String keyword);

? 可在不同數(shù)據(jù)庫間通用。

?? 不支持?jǐn)?shù)據(jù)庫特有的函數(shù)(如 LIMIT、ILIKE 等)。

?? 專業(yè)提示:當(dāng)需要不使用原生 SQL 而實現(xiàn)動態(tài)篩選或?qū)嶓w關(guān)系時,請使用 JPQL(Java 持久化查詢語言)。

2.3 原生SQL查詢

當(dāng)JPQL無法滿足復(fù)雜查詢需求(如多表連接、子查詢、數(shù)據(jù)庫特有函數(shù)或性能優(yōu)化)時,需使用原生SQL。它直接操作數(shù)據(jù)庫,支持高級特性與特定語法,適用于復(fù)雜報表、分頁查詢或遺留系統(tǒng)集成,提升靈活性與性能,如下示例:

@Query(value = """
      SELECT b.title, b.isbn, AVG(b.price) as avg_price, COUNT(*) as book_count
      FROM t_book b
      WHERE b.description LIKE %?1%
        AND b.page >= ?2
      GROUP BY b.title, b.isbn
      HAVING AVG(b.price) > ?3
      ORDER BY avg_price DESC
      """, nativeQuery = true)
List<Object[]> findBookSummaryByDescriptionAndPage(String desc, Integer page, BigDecimal minAvgPrice);

? 非常適合復(fù)雜的聯(lián)接、子查詢或性能調(diào)優(yōu)。

?? 受限于特定的數(shù)據(jù)庫方言。

?? 專業(yè)提示:將原生查詢封裝在存儲庫方法中,以保持服務(wù)層的整潔和可移植性。

2.4 Criteria API查詢(動態(tài)查詢)

Criteria API 是 JPA 提供的類型安全、面向?qū)ο蟮膭討B(tài)查詢構(gòu)建方式,通過 Java 代碼而非字符串拼接 JPQL,適用于條件動態(tài)變化的查詢場景,提升可維護(hù)性與編譯時檢查能力,如下示例:

private final EntityManager entityManager ;


public List<Book> findBooksByCriteria(String title, BigDecimal minPrice, Integer minPage, String rating) {
  CriteriaBuilder cb = entityManager.getCriteriaBuilder();
  CriteriaQuery<Book> query = cb.createQuery(Book.class);
  Root<Book> root = query.from(Book.class);
  List<Predicate> predicates = new ArrayList<>();
  if (title != null && !title.isEmpty()) {
    predicates.add(cb.like(cb.lower(root.get("title")), "%" + title.toLowerCase() + "%"));
  }
  if (minPrice != null) {
    predicates.add(cb.greaterThanOrEqualTo(root.get("price"), minPrice));
  }
  if (minPage != null) {
    predicates.add(cb.greaterThanOrEqualTo(root.get("page"), minPage));
  }
  if (rating != null && !rating.isEmpty()) {
    predicates.add(cb.equal(root.get("rating"), rating));
  }
  query.select(root).where(predicates.toArray(new Predicate[0])).orderBy(cb.asc(root.get("title")));
  return entityManager.createQuery(query).getResultList();
}

控制臺輸出:

圖片圖片

? 動態(tài)查詢,無需字符串拼接。

?? 語法冗長——但安全且功能強(qiáng)大。

?? 專業(yè)提示:在篩選條件經(jīng)常變化的內(nèi)部搜索API中使用CriteriaBuilder。

2.5 Specification API(簡潔的動態(tài)查詢)

Specification 是 Spring Data JPA 對 JPA Criteria API 的封裝,支持以函數(shù)式編程方式構(gòu)建可復(fù)用、可組合的查詢條件。通過 Specification<T> 接口實現(xiàn)動態(tài)查詢,適用于復(fù)雜、多條件組合的業(yè)務(wù)場景,提升代碼可讀性與模塊化程度,尤其適合后臺管理搜索功能,如下示例:

public class BookSpecs {
  public static Specification<Book> hasTitleLike(String keyword) {
    return (root, query, criteriaBuilder) -> keyword == null || keyword.isEmpty() ? null
        : criteriaBuilder.like(criteriaBuilder.lower(root.get("title")), "%" + keyword.toLowerCase() + "%");
  }
  public static Specification<Book> hasMinPrice(BigDecimal minPrice) {
    return (root, query, criteriaBuilder) -> minPrice == null ? null
        : criteriaBuilder.greaterThanOrEqualTo(root.get("price"), minPrice);
  }
}
Repository需要繼承如下接口
public interface BookRepository 
    extends JpaSpecificationExecutor<Book> {
}
測試用例
@Test
public void testSpec() {
  List<Book> books = this.bookRepository.findAll(BookSpecs.hasTitleLike("Spring")) ;
  System.err.println(books) ;
}
控制臺輸出

圖片圖片

JpaSpecificationExecutor支持如下的接口

圖片

2.6 QBE查詢

Query by Example(QBE,示例查詢)是一種用戶友好的查詢技術(shù),提供簡潔的接口,支持動態(tài)生成查詢條件。它無需手動編寫包含字段名的查詢語句,甚至完全不需要使用數(shù)據(jù)庫特定的查詢語言(如 SQL、JPQL),如下示例:

public List<Book> searchBooks(String title, BigDecimal price, String rating) {
  // 1.創(chuàng)建示例實體(Probe)
  Book probe = new Book();
  probe.setTitle(title); 
  probe.setPrice(price);
  probe.setRating(rating);
  // 2.構(gòu)建匹配器(Matcher),實現(xiàn)復(fù)雜控制
  ExampleMatcher matcher = ExampleMatcher.matching()
          .withStringMatcher(StringMatcher.CONTAINING) // 字符串使用LIKE %...%
          .withIgnoreNullValues()                     // 忽略null值(默認(rèn))
          .withMatcher("rating", match -> match.exact()); // rating字段要求精確匹配
  // 3.創(chuàng)建Example實例
  Example<Book> example = Example.of(probe, matcher);
  // 4.執(zhí)行查詢
  return bookRepository.findAll(example);
}
控制臺輸出

圖片圖片

? 非常適合搜索表單。

?? 不支持聯(lián)表查詢或復(fù)雜邏輯。

?? 專業(yè)提示:可在管理后臺或管理工具中用于快速篩選。

總結(jié)


圖片圖片

責(zé)任編輯:武曉燕 來源: Springboot全家桶實戰(zhàn)案例
相關(guān)推薦

2024-10-14 13:26:42

2022-12-06 10:39:43

Spring事務(wù)失效

2024-05-30 08:51:28

Spring數(shù)據(jù)分布式

2025-07-08 08:20:39

2024-08-30 11:11:01

2024-01-05 13:25:00

架構(gòu)架構(gòu)模式開發(fā)

2017-10-20 11:07:45

編程代碼編程模式

2025-04-29 08:21:30

ANRAndroidUI

2010-10-22 16:29:11

SQL Server刪

2019-08-02 08:50:47

API架構(gòu)微服務(wù)

2024-12-18 16:19:51

2010-04-14 10:18:39

Linux init

2025-07-14 03:00:00

2015-07-28 13:45:14

大數(shù)據(jù)商業(yè)商業(yè)模式

2017-06-26 10:35:58

前端JavaScript繼承方式

2024-10-12 08:18:21

Spring接口組件

2018-07-04 11:02:23

無線傳輸模式

2011-02-24 10:56:34

人才

2022-05-12 09:02:50

編程語言PythonJava

2019-05-16 13:00:18

異步編程JavaScript回調(diào)函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

国产精彩精品视频| 亚洲午夜久久久影院| 宅男av一区二区三区| 日本欧美高清| 亚洲国产精品资源| 免费在线观看麻豆视频| 懂色av一区二区夜夜嗨| 91在线观看免费高清完整版在线观看| 自拍偷拍欧美视频| 欧美精三区欧美精三区| 天天干天天草天天| 夫妻av一区二区| 日本成人三级电影网站| 亚洲蜜桃视频| 精品二区视频| 久久免费电影网| 日本成人性视频| 欧美aⅴ99久久黑人专区| 久久久久久国产三级电影| 美女福利一区二区| 日韩一卡二卡三卡四卡| 调教在线观看| 尤物av一区二区| 在线免费视频一区| 丁香桃色午夜亚洲一区二区三区| 久久久久九九九| 亚洲电影影音先锋| 成人网址在线观看| 亚洲国产欧美日韩在线观看第一区| 亚洲日韩欧美视频一区| 毛片在线视频| 欧美视频日韩视频| 国产剧情在线观看| 91黄视频在线观看| 美国一级片在线免费观看视频| 亚洲一区二三区| jizz欧美性11| 亚洲另类在线视频| 免费免费啪视频在线观看| 中文字幕一区二区三中文字幕 | 国产一二在线播放| 欧美v国产在线一区二区三区| 国产黄色在线免费观看| 7777精品伊人久久久大香线蕉经典版下载| 同心难改在线观看| 欧美色另类天堂2015| 深夜福利视频在线观看| 在线看一区二区| 免费网站看v片在线a| 欧美精品一卡二卡| 欧美三级黄网| 精品成人免费观看| 成人在线爆射| 久久久国产视频| 日韩精品视频在线看| 高清欧美性猛交xxxx| 乱中年女人伦av一区二区| 欧美亚洲第一页| 成人写真视频| 2019国产精品视频| 三级欧美韩日大片在线看| 女女同性女同一区二区三区按摩| 国产成人免费在线观看| 欧美日韩成人免费视频| 国产午夜三级一区二区三| 韩国97影院| 欧美天堂一区二区三区| 美女日批视频在线观看| 日韩在线视频播放| 中文字幕精品影院| 精品视频一区二区三区四区| 精品一区二区三区免费毛片爱| 免费成人午夜视频| 亚洲欧洲综合另类| 日本在线免费| 日韩在线免费av| 久久精品国产www456c0m| 狼狼综合久久久久综合网| 久久精品国产成人一区二区三区 | 一区二区在线看| 韩国三级在线观看久| 亚洲精品久久久久| 北条麻妃一区二区三区在线观看| 91免费精品国偷自产在线| 久久99久久久久| 91美女在线免费观看| 欧美人伦禁忌dvd放荡欲情| jizzyou欧美16| 成人久久一区二区| 国产成人综合网站| 国产精品㊣新片速递bt| 精品久久五月天| 偷窥自拍亚洲色图精选| 国产伦精品一区二区三毛| 国产suv精品一区二区三区| 日日噜噜噜夜夜爽爽狠狠视频| 日韩欧美一区二区在线视频| 欧美成年网站| 免费精品视频一区| 国产精品美日韩| 宅男网站在线免费观看| 欧美性受xxx| 日韩**一区毛片| www污污在线| 在线播放精品一区二区三区 | 9999精品| 国产日韩欧美亚洲一区| 久久精品一区二区| 成人高清免费在线| 日本精品久久久久影院| 国产乱人伦偷精品视频免下载| 97影院在线观看| 日韩一区二区三区xxxx| 欧美亚洲专区| 在线成人福利| 久久久久中文字幕2018| 久久av老司机精品网站导航| 中文字幕中文字幕在线中文字幕三区| 亚洲一区二区久久| 国产一级一区二区| 黄污网站在线观看| 欧美大片第1页| 国产黄人亚洲片| 很黄的网站在线观看| 国产精品人成电影| 国产日韩欧美a| 成人线上视频| 日本黑人久久| 欧美色综合天天久久综合精品| 久久av电影| 黄色在线视频网| 日韩中文字幕网| 精品一区二区免费| 成人在线影视| 古典武侠综合av第一页| 亚洲一区二区三区中文字幕在线| 国产aa精品| 国产经典久久久| 亚洲第一网站男人都懂| 久久精品系列| 国产写真视频在线观看| 国产一区二区久久久| 色综合中文综合网| 日韩片欧美片| 97在线观看免费高清视频| 欧美一二三视频| 国产精品久久久久影视| caoporn成人免费视频在线| 欧美精品久久久久久久免费| 亚洲免费av电影| 精品午夜一区二区三区在线观看| 特级毛片在线| 亚洲国产一区二区三区在线| 精品视频色一区| 在线欧美日韩| 92国产在线视频| 久久伦理网站| 这里是久久伊人| 天堂成人国产精品一区| 七七成人影院| 欧美一级免费在线观看| 日韩精品亚洲元码| 国产精品亚洲人在线观看| 欧美日韩免费看片| 国产aaa免费视频| www.日韩系列| 亚洲国产精品av| 国产精品密蕾丝视频下载| 毛片.com| 91精品视频网站| 欧美日韩精品是欧美日韩精品| 国产精品久久777777毛茸茸| 污片视频在线免费观看| 中文字幕一区二区三区5566| 亚洲欧洲在线播放| 久久久一区二区| 欧美毛片免费观看| 亚洲第一视频| 欧美精品二区三区四区免费看视频 | 性欧美xxxx免费岛国不卡电影| 五月综合网站| 国产精品久久久久久av福利| 黄网动漫久久久| 亚洲永久免费精品| 姬川优奈av一区二区在线电影| 青青视频在线播放| 国产成人精品av在线| 欧美在线三级电影| 日本不卡一二三区黄网| avav成人| 日本高清视频网站www| 丁香婷婷久久久综合精品国产| 日韩欧美一级精品久久| av网站免费线看精品| 精品免费一区二区| 黑人精品视频| 妞干网在线视频| 日韩高清国产精品| 久久久女女女女999久久| 一本大道久久a久久综合|