如果查詢具有支付的最高金額和最低金額的子選擇,例如:
SELECT p.firstname,
p.lastname,
(SELECT MAX(pmt.amount)
FROM Payment pmt
WHERE pmt.person.id = p.id) maxAmount,
(SELECT MIN(pmt.amount)
FROM Payment pmt
WHERE pmt.person.id = p.id) minAmount,
FROM Person p
我們需要撰寫兩個子查詢。這在大型資料庫上表現不佳。
普通 JPQL 中的任何解決方案?
uj5u.com熱心網友回復:
如果你有一個巨大的資料庫,這個問題可能應該通過調整模式設計來解決。大多數 RDBMS 必須對Payment表進行全表掃描才能找到最小值和最大值 amount。您可以通過查看EXPLAIN當前查詢的輸出來檢查這一點。
由于您關心查詢速度,您可以對模式進行非規范化并將maxAmountandminAmount列存盤在Person表中或創建一個新PersonMinMaxPayment表。然后,您可以在將新行插入Payment表時更新這些,例如通過宣告@PrePersist或創建觸發器。
如果您的系統最終能夠保持一致,那么還有更多的可能性。您可以延遲重新計算這些值,例如作為每天一次的批處理作業。
uj5u.com熱心網友回復:
我用這個:
SELECT p.firstname,
p.lastname,
MAX(pmt.amount),
MIN(pmt.amount)
FROM Person p
LEFT JOIN p.payments pmt
GROUP BY p.firstname, p.lastname
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513452.html
標籤:爪哇jpajpql
