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

開發(fā)效率翻倍!Spring Boot @Formula 注解帶你告別繁瑣 SQL!

數(shù)據(jù)庫 其他數(shù)據(jù)庫
?@Formula?? 是 JPA 世界里的一把利刃,它讓我們能在實體層優(yōu)雅地表達計算邏輯。? 無論是聚合查詢、衍生屬性還是條件標識,都能在不破壞 ORM 結構的情況下完成。

在實際項目中,我們常常需要在實體層中展現(xiàn)一些“計算得來的值”——例如折扣價、總金額、平均值或派生狀態(tài)。 若每次都在 Service 層或 Mapper 層手寫 SQL,不僅讓代碼臃腫、可讀性差,還容易在后續(xù)維護中引發(fā)問題。

其實 Hibernate 早就給出了優(yōu)雅的答案:@Formula 注解。 它能讓我們直接在實體屬性中嵌入 SQL 表達式,從而在 ORM 層實現(xiàn)復雜計算與查詢邏輯。 這意味著,我們可以在不增加數(shù)據(jù)庫字段的情況下,讓實體自動攜帶計算結果

@Formula 是什么?

@Formula 是 Hibernate 提供的一個注解,用來聲明一個由 SQL 表達式計算出的只讀字段。 它不會映射到數(shù)據(jù)庫的實際列,而是在查詢時由 Hibernate 自動計算。

這種機制適用于:

  • 派生值(如全名、折扣價)
  • 聚合計算(如訂單總額、平均值)
  • 條件表達式(如狀態(tài)標志)

簡單來說,@Formula 能幫我們把一段 SQL 內聯(lián)到實體字段,從而讓計算邏輯與領域模型自然融合。

基礎用法:讓折扣價自動算出來

下面通過一個簡單示例,演示如何讓 Book 實體自動計算折扣價。

示例代碼

package com.icoderoad.formula.entity;


import jakarta.persistence.*;
import org.hibernate.annotations.Formula;
import java.math.BigDecimal;


@Entity
@Table(name = "t_book")
public class Book {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    private String title;
    private String isbn;
    private String description;
    private Integer page;
    private BigDecimal price;


    // 利用 @Formula 直接計算 9 折后的價格
    @Formula("price * 0.9")
    private BigDecimal discountedPrice;


    // Getter / Setter ...
}

當 Hibernate 查詢 Book 時,會自動生成如下 SQL:

select
    b.id,
    b.title,
    b.isbn,
    b.description,
    b.page,
    b.price,
    b.price * 0.9 as discountedPrice
from
    t_book b

無需手動計算,折扣價字段在加載實體時就自動帶上,簡潔又安全

高級玩法:在實體中實現(xiàn)聚合查詢

對于涉及多表計算的復雜場景,@Formula 的威力更大。 我們可以使用子查詢來計算關聯(lián)表的總和、計數(shù)或平均值,完全不需要顯式的 @Join

示例代碼

package com.icoderoad.formula.entity;


import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import org.hibernate.annotations.Formula;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;


@Entity
@Table(name = "x_order")
public class Order {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    private String orderNo;
    private LocalDateTime orderDate = LocalDateTime.now();


    // 計算訂單項的總金額
    @Formula("(SELECT COALESCE(SUM(oi.quantity * oi.price), 0) FROM x_order_items oi WHERE oi.order_id = id)")
    private BigDecimal totalAmount;


    // 統(tǒng)計訂單項數(shù)量
    @Formula("(SELECT COUNT(*) FROM x_order_items oi WHERE oi.order_id = id)")
    private Integer itemCount;


    // 計算平均單價
    @Formula("(SELECT COALESCE(AVG(oi.price), 0) FROM x_order_items oi WHERE oi.order_id = id)")
    private BigDecimal averageItemPrice;


    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<OrderItem> items = new HashSet<>();
}
package com.icoderoad.formula.entity;


import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import java.math.BigDecimal;


@Entity
@Table(name = "x_order_items")
public class OrderItem {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    @Column(nullable = false)
    private Integer quantity;


    @Column(nullable = false)
    private BigDecimal price;


    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id", nullable = false)
    private Order order;
}

生成的 SQL 示例:

select
    o.id,
    o.order_no,
    o.order_date,
    (select coalesce(sum(oi.quantity * oi.price),0) from x_order_items oi where oi.order_id=o.id) as totalAmount,
    (select count(*) from x_order_items oi where oi.order_id=o.id) as itemCount,
    (select coalesce(avg(oi.price),0) from x_order_items oi where oi.order_id=o.id) as averageItemPrice
from
    x_order o

這樣我們就能直接在實體中拿到統(tǒng)計值,而不需要額外的 SQL 或 DTO 轉換。

其它實用場景

@Formula 的靈活性極高,它能輕松應對各種派生邏輯:

聚合統(tǒng)計

@Formula("(select count(o.id) from orders o where o.customer_id = id)")
private int orderCount;

條件標志

@Formula("(case when status = 'ACTIVE' then true else false end)")
private boolean isActive;

派生屬性

@Formula("concat(first_name, ' ', last_name)")
private String fullName;

跨表計算

@Formula("(select coalesce(sum(p.amount), 0) from payments p where p.customer_id = id)")
private double totalPayments;

業(yè)務規(guī)則標志

@Formula("(case when balance < 0 then true else false end)")
private boolean isOverdrawn;

性能與最佳實踐

雖然 @Formula 用起來非常方便,但也有一些注意事項:

使用建議

  • 讀多寫少的場景最適合:例如統(tǒng)計類字段或展示性派生屬性;
  • 復雜表達式要謹慎:避免在高并發(fā)查詢中使用嵌套聚合;
  • 明確只讀特性@Formula 字段不會參與 INSERT 或 UPDATE
  • 注意 SQL 方言兼容性:部分數(shù)據(jù)庫的函數(shù)或語法差異可能導致問題;
  • 日志調試時打開 SQL 輸出:有助于分析生成語句性能。

不推薦場景

  • 涉及業(yè)務邏輯復雜的計算;
  • 需要頻繁更新或寫入字段;
  • 對數(shù)據(jù)庫移植性要求高的系統(tǒng)。

結語:用 @Formula 打造簡潔的領域模型

@Formula 是 JPA 世界里的一把利刃,它讓我們能在實體層優(yōu)雅地表達計算邏輯。 無論是聚合查詢、衍生屬性還是條件標識,都能在不破壞 ORM 結構的情況下完成。

如果你希望項目的代碼更干凈、邏輯更集中、查詢更智能, 那么請記得——不要再把 SQL 寫進 Service 層,讓 @Formula 來幫你“做計算”吧!

責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-04-18 04:22:00

2024-09-06 08:02:52

2023-09-13 15:09:35

軟件開發(fā)數(shù)字化進程

2017-08-02 14:44:06

Spring Boot開發(fā)注解

2025-04-27 03:00:00

Spring集成測試

2025-04-08 03:00:00

SpringDocker容器

2025-02-27 09:10:00

MarkdownHTML前端

2025-09-01 01:25:00

SpringMVC注解

2025-08-29 07:36:07

2025-08-21 09:35:29

2023-06-02 16:24:46

SpringBootSSM

2025-05-26 03:55:00

Spring開發(fā)Autowired

2025-05-26 10:05:00

Ansible模塊自動化

2025-01-24 07:44:31

LinuxsystemdAnsible

2025-10-28 01:25:00

SQL查詢Spring查詢模式

2020-12-13 17:54:36

開發(fā)人員

2023-05-04 12:41:30

ChatGPTSQL數(shù)據(jù)分析

2025-02-03 23:35:56

API技術.NET

2024-09-05 09:46:37

操作體系密碼
點贊
收藏

51CTO技術棧公眾號

欧美日韩破处| www.国产精品视频| 精品久久亚洲| 久久久久久97三级| 欧美激情视频一区二区三区不卡| 久久精品香蕉视频| 亚洲精品福利网站| 97视频精品| 在线日韩av片| 久久99精品久久久久久水蜜桃 | www.av精品| 久久精品影视伊人网| 久久免费视频3| 性做久久久久久久| 性欧美欧美巨大69| 欧美日韩性生活| 品久久久久久久久久96高清| 久久久久久久久久免费视频| 国产精品一线| 亚洲午夜久久久| 91成人免费视频| 国产精品麻豆免费版现看视频| 黄色亚洲网站| 99久久精品国产毛片| 欧美激情精品久久久久久蜜臀| 亚洲欧美日韩三级| 在线观看免费版| 丝袜亚洲另类欧美| 在线观看不卡av| 国产三级日本三级在线播放| 九色网友自拍视频手机在线| 羞羞答答国产精品www一本| 日韩二区三区在线| 青青草国产免费| 蜜臀久久99精品久久久| 日韩一级大片| 日韩精品极品在线观看播放免费视频| 蜜臀精品一区二区| 天天躁日日躁狠狠躁伊人| 国产婷婷精品| 亚洲日韩欧美视频| 欧美日韩亚洲一二三| 国产在线观看精品一区| 奇米777欧美一区二区| 中文字幕日韩欧美在线视频| 91高清国产视频| 成人黄色网址| 9i在线看片成人免费| 国产69久久精品成人| 成人免费毛片糖心| 欧美成人三级| 亚洲一级二级三级| 精选一区二区三区四区五区| 国产精品久久久久久久久久精爆| 欧美肉体xxxx裸体137大胆| 欧美三级日韩三级国产三级| 国产美女视频免费| 可以免费看毛片的网站| 久久久久国产精品午夜一区| 精品国产美女在线| 亚洲国产精品狼友在线观看| 中文字幕21页在线看| 国产精品免费丝袜| 国产精品yjizz| 精品国产xxx| 欧美一区二区三区久久精品茉莉花 | 亚洲一区二区三区精品动漫| 国产毛片毛片毛片毛片| 欧美午夜精品| 亚洲天堂av在线免费观看| 亚洲天堂2018av| 国产丝袜视频在线播放| 国产日韩综合av| 99视频网站| 波多野结衣不卡| 欧美精品九九| 亚洲无av在线中文字幕| 免费在线观看日韩av| xxx欧美xxx| 亚洲欧美日韩国产综合| 久久精品日产第一区二区三区| 亚洲天堂999| 中日韩男男gay无套| 最新亚洲国产精品| 亚洲av无码一区二区三区观看| 日韩一区中文| 色一区在线观看| 人妻无码一区二区三区四区| 国产裸舞福利在线视频合集| 成人激情av网| 91免费视频网站| 无码人妻精品一区二区三区9厂| 综合久久精品| 日韩在线欧美在线| 一区二区精品免费| 国产一区二区三区亚洲| 91麻豆精品国产91久久久久久| 成人羞羞国产免费网站| 1区2区在线| 亚洲乱码国产乱码精品精可以看 | 欧美日韩在线另类| a级片一区二区| 麻豆影视国产在线观看| 久久精品日韩一区二区三区| 国语精品中文字幕| www.爱爱.com| 国产自产v一区二区三区c| 国产成人免费91av在线| 国产乱国产乱老熟| 亚洲日产国产精品| 欧美日韩福利在线观看| 97成人资源站| 91精品一区国产高清在线gif| 一本久久综合亚洲鲁鲁| 亚洲综合色一区| 亚欧日韩另类中文欧美| 亚洲国产精彩中文乱码av| 一个人看的视频www| 日韩电影精品| 欧美乱熟臀69xxxxxx| 欧美成人福利在线观看| 国产人妖一区| 51午夜精品国产| 亚洲天堂网2018| 99re8精品视频在线观看| 欧美日韩久久一区二区| 国内外成人免费在线视频| 久久精品黄色| 欧美在线免费视屏| 天天色综合天天色| 国产极品一区| 在线播放视频一区| 四川一级毛毛片| 91精品啪在线观看国产爱臀 | 亚洲精品美腿丝袜| 无码日本精品xxxxxxxxx| 污网站在线免费看| 亚洲.国产.中文慕字在线| 精品国产一区三区| 欧美成人黑人| 欧美日韩中文字幕一区| 日本人视频jizz页码69| 四虎国产精品免费久久| 精品久久久久久久久久久久久久久久久 | 亚洲高清在线观看一区| 日本成人网址| 亚洲一区二区三区四区五区黄 | 91九色美女在线视频| 天天操天天干天天综合网| av黄色在线网站| 日本欧美一区| 6080yy午夜一二三区久久| 婷婷五月精品中文字幕| 亚洲精品动态| 久久天堂电影网| 亚洲免费激情视频| 日韩高清在线一区| 亚洲精品日韩av| 天堂91在线| 中文字幕色av一区二区三区| 草草草视频在线观看| 天堂av在线网| 在线播放日韩导航| 亚洲啪av永久无码精品放毛片| 在线日韩一区| 久久不射电影网| 一级片视频在线观看| 激情综合色综合久久综合| 国产免费一区二区三区| 国产女主播在线直播| 亚洲免费av高清| 日韩 欧美 高清| 欧美2区3区4区| 亚洲人成在线播放| 九九热视频精品| 青青草97国产精品免费观看无弹窗版 | 大桥未久av一区二区三区中文| 蜜桃导航-精品导航| 国产原创视频在线观看| 欧美特级www| 久久久久亚洲av片无码v| 亚洲国产网址| 久久青草福利网站| 国产精品久久久久精| 2023国产一二三区日本精品2022| 欧美h视频在线观看| 日韩影片中文字幕| 亚洲成人精品在线| 免费成人深夜夜行网站| 久久av最新网址| 国产一区精品视频| 91网址在线观看| 精品视频在线视频| 色无极影院亚洲| 夜久久久久久| 国产精品免费观看高清| 成视频免费观看在线看| 欧美三级视频在线播放| 91精品人妻一区二区三区| 亚洲精选91| 国产精品美女黄网| 欧美家庭影院| 欧美成人三级在线| 欧美激情图片小说| 久久av资源站| 亚洲午夜精品久久久中文影院av | 亚洲专区一二三| 日韩av影视大全| 国产精品久久久久久久免费观看 | 午夜精品一区二区三区在线视 | 成人久久久精品乱码一区二区三区| 综合操久久久| 色婷婷成人网| www.久久久久| 91资源在线视频| 国产精品久久久一本精品| 99sesese| 99九九热只有国产精品| 成人国产精品av| 日本www在线| 欧美一区二区三区在线观看 | 欧美日韩国产精品一区二区不卡中文 | 五月天婷婷久久| 91在线视频网址| 欧美牲交a欧美牲交aⅴ免费真| 日韩精品亚洲aⅴ在线影院| 97视频免费在线观看| 亚洲欧美日韩综合在线| 色视频一区二区| 人人妻人人澡人人爽| 日本美女一区二区三区| 一区二区三区四区五区视频| jizzyou欧美16| www.日韩系列| 精品久久久无码中文字幕| 亚洲国产精品久久不卡毛片 | 中文在线资源观看网站视频免费不卡| www.99在线| 亚洲无中文字幕| 高清av免费一区中文字幕| 色黄视频在线观看| 中文字幕av日韩| 99久久精品无免国产免费| 亚洲一二三专区| 日韩www视频| 日本亚洲视频在线| 亚洲av综合色区| 欧美丝袜美腿| 国产精品成人久久久久| 黄色网址视频在线观看| 亚洲福利在线看| 91视频在线视频| 亚洲情趣在线观看| 国产黑丝一区二区| 免费人成精品欧美精品| 成人一级生活片| 欧美精选一区二区三区| 99九九视频| 偷拍中文亚洲欧美动漫| 久久久国产一区二区| 殴美一级特黄aaaaaa| 色婷婷国产精品久久包臀| 娇小11一12╳yⅹ╳毛片| 国产很黄免费观看久久| 37pao成人国产永久免费视频| 国产国产精品| 久久免费视频1| 国产日韩一区二区三免费高清| 69av在线播放| 国产精品久久久久久福利| 日韩av在线影院| 国产裸体无遮挡| 欧美性开放视频| 国产又黄又爽又无遮挡| 91免费看`日韩一区二区| 极品粉嫩美女露脸啪啪| 一区二区动漫| 97在线免费视频观看| 热久久天天拍国产| 精品在线视频一区二区| 亚洲视频一起| 成人免费自拍视频| 欧美福利在线播放| 午夜精品久久久久久久男人的天堂| 1769视频在线播放免费观看| 亚洲精品乱码久久久久久按摩观| 一级片在线观看视频| 色婷婷久久久亚洲一区二区三区| 日本熟女一区二区| 亚洲人成在线播放网站岛国| 我不卡一区二区| 成人av电影免费在线播放| 在线免费观看av网| 七七婷婷婷婷精品国产| 成人一区二区三| 久久av一区| 欧美精品99久久| 亚洲手机在线| 91精品一区二区三区四区| 久久人体视频| 亚洲人成网站在线播放2019| 少妇精品久久久| 精品蜜桃一区二区三区| 97久久综合精品久久久综合| 2014国产精品| 精品视频一二| 7777精品伊久久久大香线蕉语言| 国产精品第一国产精品| 国产精品成人va在线观看| 欧美性suv| 日本成人免费在线| 大胆人体一区二区| 日韩美女写真福利在线观看| 依依综合在线| 国产www精品| 日韩视频网站在线观看| 国产99在线|中文| 日韩av超清在线观看| 国产精品91久久| 中文字幕系列一区| 国产精品一区二区久久久| 国产麻豆一区| 91免费的视频在线播放| 精品午夜视频| 国产伦精品一区| 天堂av一区二区三区在线播放 | 日韩av电影国产| 蜜桃视频成人m3u8| 国产欧美日韩免费| 精品国产乱码久久久久久樱花| 999国内精品视频在线| 91精品国产自产精品男人的天堂| 国产乱码精品一区二区三区卡| 日韩高清一级| 手机在线观看国产精品| 久久美女精品| 成人在线国产视频| 麻豆精品网站| 欧美激情第3页| 国产91综合网| 波多野吉衣中文字幕| 亚洲国产高清在线| 久草视频免费播放| 欧美日韩亚洲精品一区二区三区 | 91在线三级| 国产精品福利片| 日韩一区二区三区色| 精品国产一区二区三区四区vr | 欧美做受777cos| 亚洲经典自拍| 亚洲成人福利在线观看| 国产一区二区成人久久免费影院| 艳妇乳肉豪妇荡乳xxx| 久久精品亚洲精品国产欧美 | 亚洲444eee在线观看| 波多野结衣一区二区三区在线| 3d动漫精品啪啪1区2区免费| 国产综合无码一区二区色蜜蜜| 亚洲天堂av电影| 18加网站在线| 日产精品久久久一区二区福利 | 激情五月综合色婷婷一区二区| 欧美**字幕| 成年丰满熟妇午夜免费视频 | 国产欧美一区二区三区四区| 免费精品一区| 日本不卡在线观看| 好看的av在线不卡观看| 中文字幕第36页| 成人福利视频在线| 国产美女网站视频| 精品成人在线视频| 国产精品爽爽久久| 亚洲午夜精品久久久久久久久久久久| 2024短剧网剧在线观看| 日韩免费观看高清| 91成人精品在线| 久久av秘一区二区三区| 久久婷婷久久| 色婷婷精品久久二区二区密| 亚洲青青青在线视频| 91丨九色丨海角社区| 亚洲成人激情在线| av在线免费观看网址| 国产精品露脸自拍| 亚洲精品无吗| 欧美日韩性生活片| 懂色av一区二区夜夜嗨| 潘金莲一级黄色片| 91福利精品视频| 四虎在线观看| 久久久久久久成人| 美女久久精品| 日本黄色播放器| 免费看日韩精品| 久久久久亚洲av无码a片| 欧美日韩视频在线| 欧美一级一区二区三区| 色综合色综合久久综合频道88| 成人噜噜噜噜|