精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

太炸了,三個注解!Spring Boot + JPA代碼量暴減60%

開發 前端
在Spring Boot結合JPA進行開發時,面對復雜查詢或動態過濾等常見場景,如果未能及時更新自身的技術知識儲備,就可能陷入編寫大量冗余代碼的困境。

環境:SpringBoot3.4.2

1. 簡介

在Spring Boot結合JPA進行開發時,面對復雜查詢或動態過濾等常見場景,如果未能及時更新自身的技術知識儲備,就可能陷入編寫大量冗余代碼的困境。如下問題:

1?? 查詢邏輯分散:動態條件查詢需在Service層手動拼接CriteriaBuilder或Specification,導致代碼臃腫且難以維護;2?? 重復計算邏輯:如計算總金額、統計關聯表數量等衍生字段,需在實體中編寫冗余的字段或通過DTO層重復查詢;3?? 硬編碼過濾:數據權限控制常通過全局攔截器或硬編碼SQL實現,缺乏靈活性且難以擴展;

這些痛點導致代碼量激增、維護成本高昂,且業務邏輯與數據庫操作強耦合。

解決方案

@Formula@SQLRestriction (@Where)@Filter三大注解直擊痛點:

@Formula:實體字段直接映射SQL表達式,替代重復計算邏輯;

@SQLRestriction:實體級原生SQL條件,簡化動態查詢;

@Filter:參數化過濾條件,支持會話級控制,告別硬編碼。

用好這3個強大的注解,能讓代碼量暴減60%,性能與可維護性雙提升!

接下來,我們將詳細的介紹這3個注解的詳細應用。

2. 實戰案例

2.1 @Formula

通過該注解你可以指定一個用原生SQL編寫的表達式,該表達式用于讀取屬性的值,而不是將該字段映射到數據庫中。@Formula映射定義了一個"派生"屬性,當從數據庫讀取實體時,該屬性的狀態是根據其他列和函數計算得出的。如下示例:

拼接字段值

private String name;
private BigDecimal price;


@Formula("(concat(name, '/', price))")
private String info ;

該示例中,并不會在數據庫中創建info字段,而是通過這里定義的表達式concat(name, '/', price)(concat數據庫函數)將name字段值與price字段值通過 "/" 拼接在一起。

當我們執行查詢時,sql輸出如下:

org.hibernate.SQL Line:135 - select p1_0.id,p1_0.deleted,
  (concat(p1_0.name, '/', p1_0.price)),p1_0.name,
  p1_0.price,p1_0.stock from product p1_0

將上面的表達式作為select的一部分進行查詢。

我們不僅僅可以寫表達式,我們還可以執行SQL語句。

SQL子句

@Formula("(select sum(s.sale_price * s.quantity) from sales_detail s where s.product_id = id)")
private BigDecimal salePrice ;

同樣的該salePrice字段并不會在數據庫中創建。當執行查詢時,SQL輸出如下:

SELECT
  p1_0.id,
  p1_0.deleted,(
  concat( p1_0.NAME, '/', p1_0.price )),
  p1_0.name,
  p1_0.price,(
  SELECT
    sum( s.sale_price * s.quantity ) 
  FROM
    sales_detail s 
  WHERE
    s.product_id = p1_0.id 
  ),
  p1_0.stock 
FROM
  product p1_0

表達式同樣作為select的一部分進行了子查詢。

對于這種子查詢,我們還是需要結合自己的場景來決定是否適合通過此種方式進行查詢。

2.2 @SQLRestriction

該注解可以指定一個用原生SQL編寫的約束條件,該約束條件將被添加到為實體或集合生成的SQL中。簡單說,就是可以在對當前實體查詢時動態添加查詢條件。

@Entity
@Table(name = "product")
@SQLRestriction("deleted = 0")
public class Product {
  // ...其它屬性
  
  /**0: 未刪除, 1: 已刪除*/
  @Column(columnDefinition = "int default 0")
  private Integer deleted ;
}

這里通過@SQLRestriction注解添加了 "deleted = 0",當我們對該實體Product進行查詢時都會在原來SQL中添加該條件。如下SQL執行:

SELECT
  p1_0.id,
  p1_0.deleted,
  p1_0.name,
  p1_0.price
  p1_0.stock 
FROM
  product p1_0 
WHERE
  (p1_0.deleted = 0)

我們不僅僅可以在實體類上添加,還可以在集合屬性上添加。

集合屬性上

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "product_id")
@SQLRestriction("deleted = 0")
private Set<ProductDetail> productDetails = new HashSet<>() ;


@Entity
public class ProductDetail {
  // ...


  /**0: 未刪除, 1: 已刪除*/
  @Column(columnDefinition = "int default 0")
  private Integer deleted ;
}

當我們通過Product實體查詢時,生成SQL如下:

圖片圖片

2.3 @Filter

@SQLRestriction 注解的問題在于,它僅允許我們指定一個不包含參數的靜態查詢,并且無法根據需求動態啟用或禁用它。@Filter 注解的作用與 @SQLRestriction 類似,但它還可以在會話(session)級別啟用或禁用,并且支持參數化。

@Entity
@Table(name = "product")
@FilterDef(name = "filterByDeletedAndStock", parameters = {
    @ParamDef(name = "state", type = Integer.class),
    @ParamDef(name = "stock", type = Integer.class)
})
@Filters({
    @Filter(name = "filterByDeletedAndStock", condition = "deleted=:state and stock >:stock")
})
public class Product {}

在這里,我們通過@FilterDef注解,定義了一個名為filterByDeletedAndStock過濾器,并且還定義了2個參數state和stock。

接著,我們通過@Filters注解,定義了具體的過濾條件,其中name是上面@FilterDef定義的名稱,condition則為執行時動態添加的條件。

要使用定義的@Filter條件,我們這里通過AOP的方式動態設置。

首先,我們定義一個注解,只有使用了該注解的方法,才會在執行之前開啟過濾過功能。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface EnableFilter {
}

接下來,定義切面攔截使用了@EnableFilter注解的方法。

@Component
@Aspect
public class FilterAspect {
  @PersistenceContext
  private EntityManager entityManager;
  @Around("@annotation(com.pack.formula.annotation.EnableFilter)")
  public Object doProcess(ProceedingJoinPoint joinPoint) throws Throwable {
    try {
      // 從其它地方獲取參數值
      int state = 0 ;
      int stock = 80 ;
      Filter filter = entityManager.unwrap(Session.class).enableFilter("filterByDeletedAndStock");
      filter.setParameter("state", state) ;
      filter.setParameter("stock", stock) ;
      return joinPoint.proceed();
    } catch (Throwable ex) {
      throw ex;
    } finally {
      entityManager.unwrap(Session.class).disableFilter("filterByDeletedAndStock") ;
    }
  }
}

我們這里是模擬,所以@Filter中定義的2個參數直接寫死了。

業務代碼

@EnableFilter
public List<Product> query() {
  return this.productRepository.findAll() ;
}

執行后生成的SQL如下:

圖片圖片

動態添加了查詢條件。

當我們沒有注解時,生成SQL如下:

圖片圖片

責任編輯:武曉燕 來源: Springboot全家桶實戰案例源碼
相關推薦

2025-08-15 12:19:08

2025-08-01 09:03:06

Spring重試機制網絡

2025-03-03 08:49:59

2023-09-27 23:43:51

單元測試Spring

2025-07-07 02:15:00

Spring吞吐量JVM

2020-03-31 15:03:56

Spring Boot代碼Java

2025-02-26 08:03:17

SpringJPAMyBatis

2023-11-09 08:01:41

Spring緩存注解

2022-07-15 08:52:10

代碼Java設計模式

2022-04-28 08:05:05

數據庫數據庫交互

2023-04-17 23:49:09

開發代碼Java

2025-09-12 07:55:54

2024-03-07 12:51:44

代碼CRUD數據

2020-11-02 07:00:29

Spring Boo注解自動化

2023-06-02 16:24:46

SpringBootSSM

2022-05-31 08:36:41

微服務網關鑒權

2023-09-21 10:31:06

人工智能模型

2020-06-11 09:00:27

SDN網絡架構網絡

2022-11-10 09:57:24

2025-07-28 02:55:00

虛擬列表JavaScript單線程
點贊
收藏

51CTO技術棧公眾號

亚洲免费三区一区二区| 国产精品试看| 日韩精品在线网站| 久久久性生活视频| 国产九色在线| 国产一区二区h| 国产91精品久久久| 任你操精品视频| www国产精品| 欧美在线不卡视频| 日本高清视频免费在线观看| 欧洲一区av| 国产精品综合久久| 人妖精品videosex性欧美| 女人裸体性做爰全过| 国产劲爆久久| 欧美剧情电影在线观看完整版免费励志电影 | 蜜臀av性久久久久蜜臀av| 日韩精品一二| 国产黄色精品网站| 国产精品揄拍500视频| 日韩欧美国产亚洲| 亚洲欧美综合久久久| 亚洲欧美日韩国产中文| 日本少妇一级片| 青青草国产一区二区三区| 欧美性生交大片免网| 欧美a级免费视频| 午夜视频在线免费观看| 阿v视频在线| 一区三区在线欧| 欧美大片在线观看一区二区| 91香蕉视频污版| 色在线中文字幕| 亚洲午夜精品网| 日本久久高清视频| 午夜伦全在线观看| 国产精品污污网站在线观看| 麻豆精品视频| 天天色综合av| 99久久免费精品高清特色大片| 成人乱人伦精品视频在线观看| 色一情一乱一伦| 国产精品久久国产愉拍| 欧美国产亚洲视频| 精品自拍偷拍视频| 一级毛片免费高清中文字幕久久网| 国产亚洲精品久久久久久牛牛 | 欧美国产禁国产网站cc| 欧美日韩精品免费看 | 久久久美女毛片| 激情五月综合色婷婷一区二区| 国产黄色美女视频| 国产精品一二三四| 91观看网站| 亚洲第一成年人网站| 国产激情视频一区二区在线观看 | 日韩三级毛片| 亚洲精品资源在线| 成人国产精品久久久网站| 欧美人与物videos另类xxxxx| 亚洲精品视频在线播放| 日本黄色网址大全| 教室别恋欧美无删减版| 亚洲午夜久久久久久久| 成人信息集中地| 久久精品青草| 欧美日本亚洲视频| 日本一区二区网站| 亚洲一区二区网站| 国产精品中文久久久久久久| 久久超碰亚洲| 亚洲 欧美 中文字幕| 久久免费国产| 国产精品亚洲第一区| 91精品国产乱码久久| 国产一区福利在线| 成人欧美一区二区三区黑人免费| 欧美综合视频在线| 国产色产综合色产在线视频| 在线视频亚洲自拍| 精品日韩av| 一本大道久久a久久综合| a在线观看免费视频| 国产在线视频欧美一区| 日韩电影免费在线观看中文字幕 | 中文字幕一区日韩精品欧美| 中文字幕精品在线播放| 91超碰在线免费| 欧美专区日韩专区| 亚洲一区二区三区黄色| 国产成人影院| 九九精品在线观看| 日本中文字幕第一页| 狠狠色2019综合网| 久久99九九| 国产婷婷视频在线| 欧美日韩国产专区| 亚洲精品永久视频| 亚洲资源网站| 欧美第一页在线| 波多野结衣一区二区三区在线| 国产一区不卡视频| 日韩videos| 超碰91在线观看| 欧美精品九九99久久| 在线观看av中文字幕| 欧美电影免费播放| 欧洲成人免费视频| 亚洲国产剧情在线观看| 国产女同互慰高潮91漫画| 国产一二三在线视频| 日韩久久99| 亚洲欧美日韩第一区| 久久久久久久黄色| 麻豆国产一区二区| 欧美一区二区三区成人久久片| 国产高清一区二区三区视频| 老司机午夜精品99久久| 色哟哟欧美精品| 亚洲精品中文字幕乱码无线| 自拍偷拍一区| 国内精品视频久久| www精品国产| √…a在线天堂一区| 黄色一级免费大片| 亚洲午夜久久| 6080yy精品一区二区三区| 国产黄色av网站| 亚洲欧美日韩电影| 亚洲久久中文字幕| 欧洲杯足球赛直播| 欧美中文字幕视频在线观看| 免费看av毛片| 亚洲精品午夜久久久| 国产又黄又猛的视频| 狠狠做六月爱婷婷综合aⅴ| 2019中文字幕在线观看| 熟妇高潮一区二区高潮| 亚洲第一成年网| 亚洲少妇一区二区| 欧美日本一区| 亚洲一区二区三区久久| 国产在线二区| 在线综合亚洲欧美在线视频| 日韩欧美黄色网址| 免费亚洲电影在线| 亚洲一区在线直播| 9999精品| 久久伊人91精品综合网站| 国产精品久久久久久69| 亚洲私人黄色宅男| 欧美日韩一区二区区| 亚洲澳门在线| 91黄在线观看| 91色在线看| 日韩成人中文字幕| 亚洲中文字幕无码爆乳av| 国产日产精品1区| 天天爽人人爽夜夜爽| 日韩欧美网址| 成人美女免费网站视频| 国产福利视频在线观看| 日韩欧美在线观看一区二区三区| www青青草原| 成人黄色大片在线观看| av动漫在线看| 狠狠做深爱婷婷综合一区| 国产精品欧美日韩一区二区| 亚洲s色大片| 日韩你懂的在线观看| 欧美精品一区二区免费| 日本特黄一级片| 99久久久久免费精品国产| 人妻熟女一二三区夜夜爱| 欧美色婷婷久久99精品红桃| 成人午夜在线影院| 免费不卡av| 亚洲无线码在线一区观看| 国产乱淫a∨片免费视频| 亚洲综合精品自拍| 国产免费看av| 国产麻豆精品theporn| 男女视频网站在线观看| 欧洲乱码伦视频免费| 91精品久久久久久久久| av成人影院在线| 色婷婷av一区二区三区久久| 国产成人自拍一区| 欧洲国内综合视频| 久草视频中文在线| 国产女人aaa级久久久级| 亚洲欧洲日韩综合| 日韩国产精品久久| 日韩小视频网站| 日韩精品网站| 久久久久久久久一区二区| 欧美日韩视频免费看| 午夜精品在线观看| 在线观看麻豆| 亚洲国产成人精品女人久久久| 波多野结衣绝顶大高潮| 亚洲国产日韩综合久久精品| 亚洲综合第一区| 成人一级黄色片| 色噜噜狠狠永久免费| 亚洲精品美女| 天天操天天干天天玩| 国产成人短视频在线观看| 成人动漫视频在线观看完整版| 欧洲成人一区| 欧美亚洲激情在线| 新版中文在线官网| 视频一区视频二区国产精品| 隣の若妻さん波多野结衣| 56国语精品自产拍在线观看| 日韩人妻精品中文字幕| 一区二区理论电影在线观看| 四季av中文字幕| 久久众筹精品私拍模特| 无码人妻aⅴ一区二区三区玉蒲团| 另类的小说在线视频另类成人小视频在线 | 91精品国产色综合| 特级毛片在线| 久久影视免费观看| 欧美私人网站| 色妞欧美日韩在线| 国产二区在线播放| 九一九一国产精品| 日韩美女视频中文字幕| h片在线观看视频免费| 美女av一区二区三区| 麻豆传媒视频在线| 日韩最新中文字幕电影免费看| 国产高清自拍视频在线观看| 精品视频中文字幕| 亚洲 精品 综合 精品 自拍| 精品美女在线观看| 亚洲av少妇一区二区在线观看 | 亚洲精品一区二区口爆| 制服视频三区第一页精品| 夜夜狠狠擅视频| 5月丁香婷婷综合| 国产三级小视频| 欧美一区二区网站| 性一交一乱一色一视频麻豆| 日韩欧美激情一区| 黑人操亚洲女人| 亚洲福利精品在线| 天堂av在线播放| 国产视频综合在线| 大胆av不用播放器在线播放| 在线色欧美三级视频| 91sp网站在线观看入口| 久久精品国产亚洲精品| 高h视频在线观看| 欧美床上激情在线观看| 青春草在线视频| 韩国v欧美v日本v亚洲| 久草在线中文最新视频| 日本道色综合久久影院| 色猫猫成人app| 成人av在线天堂| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 国产一级做a爰片在线看免费| 亚洲成人综合网站| 91久久国产综合久久91| 欧美日韩视频专区在线播放| 国产情侣在线播放| 欧美r级在线观看| 天天操天天射天天舔| 亚洲午夜精品久久久久久性色| 嫩草在线视频| 国内精品免费午夜毛片| 成人做爰视频www网站小优视频| 国产精品女人久久久久久| 精品国产一级| 国产在线一区二区三区欧美| 国产一区二区欧美| 国内自拍中文字幕| 亚洲一区激情| 国产精欧美一区二区三区白种人| 丰满岳乱妇一区二区三区| 亚洲天堂视频一区| 综合分类小说区另类春色亚洲小说欧美| 久草中文在线视频| 欧美这里有精品| 性一交一乱一伧老太| 亚洲天堂第二页| 青草影视电视剧免费播放在线观看| 日韩美女av在线免费观看| 韩国三级大全久久网站| 欧美极品日韩| 欧美在线播放| 国产又大又黄又粗的视频| 国产v日产∨综合v精品视频| 亚洲国产日韩一区无码精品久久久| 亚洲精品大片www| 午夜视频网站在线观看| 精品成a人在线观看| 欧美r级在线| 人人澡人人澡人人看欧美| 欧美久久亚洲| 亚洲欧洲免费无码| 国产欧美综合一区二区三区| 亚洲视频在线不卡| 久久久国产精品麻豆| 国产无遮挡免费视频| 9191精品国产综合久久久久久| 美女欧美视频在线观看免费| 久久久噜噜噜久噜久久| 国产日韩一区二区三免费高清| 欧美精品123| 亚洲深夜av| 亚洲成a人片在线www| 成人欧美一区二区三区小说| 精品久久久久久久久久久国产字幕| 日韩精品资源二区在线| 麻豆影视在线观看_| 国产成人久久久精品一区| 女人抽搐喷水高潮国产精品| 国产内射老熟女aaaa| 久久99精品久久只有精品| 人人妻人人藻人人爽欧美一区| 亚洲国产日韩一区二区| 精品人妻少妇AV无码专区| 日韩在线观看免费全集电视剧网站| 日韩脚交footjobhd| 国产精品免费在线| 欧美日韩一区二区国产| 天天色天天干天天色| 国产精品国产三级国产专播品爱网| 黄色片网站在线免费观看| 日韩av中文在线| а√天堂中文资源在线bt| 成人在线视频电影| 韩日精品在线| 苍井空张开腿实干12次| 亚洲精品免费在线| 精品国产亚洲一区二区麻豆| 欧美日韩国产成人在线| 精品亚洲二区| 国产成人一二三区| 国产精品夜夜嗨| 日韩欧美中文字幕视频| 欧美草草影院在线视频| 色婷婷视频在线观看| 91蜜桃网站免费观看| 国内精品久久久久久久97牛牛 | 成熟妇人a片免费看网站| 亚洲午夜精品一区二区三区他趣| 亚洲精品视频网| 午夜精品在线视频| 97se亚洲| 欧美精品99久久| 国产午夜精品一区二区三区四区| 波多野结衣人妻| 日日狠狠久久偷偷四色综合免费 | 日韩精品欧美国产精品忘忧草| 韩日毛片在线观看| 欧美日韩国产不卡在线看| 日韩电影在线一区二区三区| 超薄肉色丝袜一二三| 欧美美女bb生活片| 日本片在线观看| 久久久久国产精品视频| 日韩av成人高清| 欧美日韩午夜视频| 亚洲国产精品999| 婷婷六月国产精品久久不卡| 日本黄色a视频| 成人看片黄a免费看在线| 少妇太紧太爽又黄又硬又爽| 在线成人中文字幕| 精品视频国内| 久久综合九色综合88i| 日本一区二区免费在线观看视频| 国产绿帽刺激高潮对白| 91爱视频在线| 日韩极品一区| 黄色激情在线观看| 欧美午夜精品一区二区蜜桃| caoporn免费在线| 久久精品国产精品国产精品污| 久久99久久精品| 日韩欧美不卡视频| 中文综合在线观看| 久久久伦理片| 欧美日韩精品区别| 欧美日韩久久久久| 男女啪啪在线观看| 久久精品magnetxturnbtih| 久久国产精品一区二区| 自拍偷拍欧美亚洲| 欧美成人精品一区| 欧美人妖在线| 老熟妇精品一区二区三区| 欧美日韩国产片| 成人黄色免费短视频| 蜜臀精品一区二区|