精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

99久久亚洲精品蜜臀| 欧美一区久久久| 国产成人在线视频网站| 高清一区二区三区四区五区| 成人区人妻精品一区二| 在线看片福利| 国产日韩精品久久久| 国产中文字幕91| 久一视频在线观看| 免费一区二区| 日韩欧美黄色影院| caopor在线视频| 亚洲性图自拍| 久久精品视频免费| 69堂成人精品视频免费| 日本中文字幕第一页| 91精品国产自产在线观看永久∴| 亚洲风情亚aⅴ在线发布| 天堂在线资源视频| √最新版天堂资源网在线| 中文字幕国产一区二区| 成人高清在线观看| 日韩三级一区二区| 国产综合欧美| 色七七影院综合| 日本黄色片在线播放| 亚洲青青久久| 欧美专区亚洲专区| 国产精品久久中文字幕| 成人video亚洲精品| 91女神在线视频| 99re国产在线播放| 国产一区二区在线视频聊天| 久久激情婷婷| 欧美精品激情blacked18| 99久久久无码国产精品不卡| 欧美freesex8一10精品| 日韩一区二区三区四区五区六区| 男女爽爽爽视频| 蜜桃视频www网站在线观看| 国产精品久久久久久一区二区三区| 精品亚洲欧美日韩| 欧美少妇bbw| 国产大陆精品国产| 成人免费视频在线观看超级碰| 无码人妻精品一区二区| 国产亚洲成人一区| 国内揄拍国内精品| 国产无遮挡又黄又爽又色| 在线观看免费一区二区| 久久精品国产2020观看福利| 国产精品情侣呻吟对白视频| 国产一区二区三区天码| 精品亚洲va在线va天堂资源站| 岛国精品一区二区三区| 亚洲电影一区| 日韩欧美一级片| 午夜国产福利在线观看| 四虎成人精品一区二区免费网站| 欧美偷拍一区二区| 午夜激情在线观看视频| 外国电影一区二区| 欧美视频一区二区三区四区| 性欧美videossex精品| av亚洲一区二区三区| 日本韩国精品一区二区在线观看| 黄色片久久久久| 吞精囗交69激情欧美| 一本到高清视频免费精品| 久久9精品区-无套内射无码| 日韩免费福利视频| 欧美三级视频在线观看| 日韩欧美亚洲另类| 日韩免费精品| 亚洲国产精品久久91精品| 亚洲成人日韩在线| 精品日韩免费| 久久久精品中文字幕| 激情视频在线播放| 亚洲乱亚洲高清| 青草青草久热精品视频在线观看| 成人小视频在线播放| 精品一区二区三区久久久| 97自拍视频| 天堂在线观看视频| 久久精品视频一区二区| 四虎永久国产精品| 亚洲91av| 91久久线看在观草草青青| 国产精品v日韩精品v在线观看| 国产精品日韩精品在线播放| 亚洲精品一区二区三区蜜桃下载| ass精品国模裸体欣赏pics| 精品一区二区三区在线| 久久91亚洲精品中文字幕| 国产成人无码精品久在线观看| 久久亚洲视频| 51国偷自产一区二区三区| 日韩欧美亚洲系列| 亚洲欧洲精品天堂一级 | 777精品视频| 免费精品一区二区| 国产aⅴ综合色| 日韩免费中文专区| 黄色成人在线网| 欧美少妇xxx| av av在线| 色中色综合网| 97碰碰碰免费色视频| 国产一区二区麻豆| 久久先锋资源网| 乱子伦一区二区| 日韩毛片免费观看| 亚洲电影免费观看高清完整版在线| 日韩女同一区二区三区| 伊人久久综合| 91久久久在线| 福利在线观看| 狠狠做深爱婷婷久久综合一区| 亚洲18在线看污www麻豆| 在线一级成人| 国模gogo一区二区大胆私拍| 国产精品无码免费播放| 国产偷国产偷亚洲高清人白洁| 久草视频这里只有精品| 久久99久久久精品欧美| 亚洲免费福利视频| 日本a在线观看| 国产精品18久久久久久久久久久久| 欧洲久久久久久| 国产中文在线播放| 日韩精品在线看片z| 日韩影院一区二区| 九九国产精品视频| 神马影院午夜我不卡影院| 伊人网在线播放| 亚洲国产精品久久91精品| 久艹视频在线观看| 国产毛片精品视频| eeuss中文| 99热这里有精品| 日韩一级黄色av| 中文字幕日韩国产| 国产精品日韩成人| 亚洲欧美久久久久| 日韩一区二区在线免费| 国产精品wwwwww| 黄色av网址在线免费观看| 欧美性猛交xxxx乱大交极品| 亚洲久久久久久| 国产欧美短视频| 久草一区二区| 免费电影日韩网站| 亚洲另类xxxx| 久久久久在线视频| 国产日本一区二区| 亚洲黄色av网址| 日本不卡二三区| 国产日本欧美在线观看| 久久bbxx| 精品久久久久久久久久久久久久久| 福利所第一导航| 东方aⅴ免费观看久久av| 99久久免费观看| 精品人人人人| 日韩av毛片网| 99视频在线观看地址| 91精品国产综合久久久久久漫画| 欧美成人综合色| 99re热这里只有精品视频| 大肉大捧一进一出好爽动态图| 国产亚洲一区二区三区啪| 国产精品专区第二| 18+视频在线观看| 亚洲精品乱码久久久久久金桔影视 | aaaaaa亚洲| 久久婷婷蜜乳一本欲蜜臀| 69堂成人精品视频免费| 欧美aa免费在线| 一区二区三区日韩在线| 国产日韩欧美一区二区东京热| 亚洲激情五月婷婷| 不卡一区二区在线观看| 久久99精品一区二区三区三区| 欧洲精品在线播放| 九色精品国产蝌蚪| 亚洲一区二区中文字幕| 欧美三级网站| 日韩视频在线免费| 欧美一区二区公司| 欧美视频在线播放| 国产盗摄x88av| 久久精品一区二区三区av| 亚洲天堂伊人网| 国产日本精品| 手机成人av在线| 日日天天久久| 91在线|亚洲| 在线观看的黄色| 美女av一区二区| 国产特黄在线| 亚洲成成品网站| 亚洲无码精品在线播放| 婷婷丁香激情综合| www深夜成人a√在线| 26uuu成人网一区二区三区| а 天堂 在线| 日韩精品国产欧美| 久久综合久久网| 国产精品国产一区| 欧美精品成人一区二区在线观看| 国产精品美女久久久久人| 国产91九色视频| 激情在线视频播放| 日韩中文理论片| 欧美套图亚洲一区| 精品国产成人在线影院 | 欧美日韩一区在线播放| 日本综合精品一区| 国产精品一区二区久久国产| а√天堂8资源中文在线| 欧美成人精品xxx| 在线观看免费黄视频| 亚洲欧美另类国产| 天天色棕合合合合合合合| 日韩欧美在线不卡| 一级黄色a视频| 欧美亚洲国产怡红院影院| 性无码专区无码| 亚洲成人av中文| 欧美精品入口蜜桃| 成人欧美一区二区三区黑人麻豆| 女人十八毛片嫩草av| 久久久美女艺术照精彩视频福利播放| 亚洲成年人在线观看| 国产一区二区导航在线播放| 日本激情视频在线播放| 视频一区视频二区中文字幕| 少妇无码av无码专区在线观看| 欧美日本久久| 大陆极品少妇内射aaaaaa| 国产精品黑丝在线播放 | 日韩精品卡通动漫网站| av在线这里只有精品| 国产精品久久久久久亚洲色| 成人综合在线观看| 日本精品一二三区| 成人毛片老司机大片| 95视频在线观看| av在线不卡观看免费观看| 超碰caoprom| av不卡一区二区三区| 无码一区二区精品| 久久午夜电影网| 性欧美一区二区| 欧美国产一区二区在线观看| 国产又黄又粗视频| 国产精品无遮挡| 国产高清视频免费在线观看| 亚洲啪啪综合av一区二区三区| 91插插插插插插| 夜夜嗨av一区二区三区中文字幕| 久久久久久天堂| 午夜精品福利一区二区三区av| 国产a∨精品一区二区三区仙踪林| 舔着乳尖日韩一区| 日韩综合在线观看| 欧美日韩国产成人在线91| 国产成人av免费看| 欧美精品一区二区在线观看| 日本一二三区在线视频| 在线播放日韩专区| a级毛片免费观看在线| 久久久久久久一| 成人免费看黄| 国产欧美在线观看| 成人线上播放| 欧美三级华人主播| 亚洲a一区二区三区| 极品粉嫩国产18尤物| 日日夜夜一区二区| 欧美熟妇另类久久久久久多毛| 成人av在线播放网站| 日本一区二区视频在线播放| 亚洲欧美日本韩国| 久久亚洲天堂网| 欧美另类高清zo欧美| 人人妻人人澡人人爽精品日本| 亚洲新中文字幕| 色yeye免费人成网站在线观看| 日本三级韩国三级久久| 精品一区二区三区四区五区| 精品免费视频123区| 91亚洲自偷观看高清| 欧美黑人经典片免费观看 | 欧美人与性动交α欧美精品| 91在线一区二区| 天天做夜夜爱爱爱| 欧美午夜激情小视频| 国产美女明星三级做爰| 亚洲欧美制服丝袜| 秋霞在线午夜| 国产精品色悠悠| 欧美黑人巨大videos精品| 五月天在线免费视频| 老司机亚洲精品| 男男一级淫片免费播放| 1024精品合集| 亚洲高清视频免费观看| 亚洲精品一线二线三线无人区| 免费在线毛片网站| 国产成人在线精品| 激情小说一区| 成人在线观看毛片| 麻豆精品视频在线观看免费| 国产精品300页| 亚洲一区二区精品3399| 国产乱淫a∨片免费观看| 亚洲男人av在线| 国产在线美女| 国产自产精品| 欧美精品一卡| 五月天婷婷影视| 国产精品久久久久久亚洲伦| 极品国产91在线网站| 日韩av一区二区在线| 四虎av在线| 92国产精品视频| 久久亚洲国产| 九九热免费在线观看| 国产日产欧美一区| 成人午夜精品视频| 亚洲图片欧美午夜| 成人动漫一区| 欧美激情一区二区三区在线视频 | 亚洲欧美日韩人成在线播放| 国产情侣小视频| 亚洲色图在线观看| 日本综合字幕| 日本欧洲国产一区二区| 丝袜美腿亚洲一区二区图片| 最新中文字幕视频| 一本一道综合狠狠老| 暖暖视频在线免费观看| 人妖精品videosex性欧美| 日韩大胆成人| 成人羞羞国产免费网站| 久久一区二区视频| 69视频免费看| 社区色欧美激情 | 91精品福利观看| 91精品国产吴梦梦| 国产老女人精品毛片久久| 性色av无码久久一区二区三区| 欧美一二三区在线| 欧美极品少妇videossex| 99久久伊人精品影院| 亚洲国产日韩欧美一区二区三区| 性色av蜜臀av浪潮av老女人| 婷婷综合另类小说色区| 日韩精品系列| 国产精品免费一区| 久久久久久久久久久久久久久久久久| 亚洲成人福利视频| 黄网站色欧美视频| 阿v免费在线观看| 成人免费黄色网| 亚洲国产二区| 人妻aⅴ无码一区二区三区| 欧美最猛性xxxxx直播| 麻豆av免费在线观看| 99久久久久国产精品免费| 亚洲综合精品| 殴美一级黄色片| 日韩欧美二区三区| 澳门成人av网| 正在播放久久| 成人黄色a**站在线观看| 午夜精品一区二| 久久精品小视频| 久久精品福利| 亚洲三级视频网站| 亚洲精品亚洲人成人网| 亚洲av片一区二区三区| 国产精品一香蕉国产线看观看| 欧美精品网站| 免费黄色片网站| 日韩一区二区电影在线| 97成人资源| 日韩视频在线免费播放| 91免费视频网| 97免费观看视频| 91高潮在线观看| 性xxxx欧美老肥妇牲乱| 蜜桃精品成人影片| 91精品欧美综合在线观看最新| 丝袜老师在线| 伊人再见免费在线观看高清版 | 麻豆精品网站| 激情四射综合网|