我有一個名為 groups 的表,有四個 [relevant] 列;id、parent_id、activated_date和type。parent_id 和activated_date 可以為空,如果一個組在今天之前有一個activated_date,型別為A,或者它的父組已激活,則認為該組已激活。
| ID | parent_id | 激活日期 | 型別 |
|---|---|---|---|
| 1 | 2020-01-01 | A型 | |
| 2 | 3 | B型 | |
| 3 | 2020-01-01 | C型 |
我正在嘗試撰寫一個列出所有已激活組的查詢,但我遇到了一個非常令人困惑的問題。(注意:我使用 CASE 陳述句,因為在 JPA 中條件運算式不允許在 SELECT 子句中,但它們在 CASE 運算式中)
如果我的 WHERE 子句如下所示:
(CASE
WHEN
g.activated_date is not null AND
g.activated_date < CURDATE()
THEN TRUE
WHEN
g.group_type = 'typeA'
THEN TRUE
ELSE FALSE
END) = TRUE
然后我找到 9000 個激活的組(如果我更改為 FALSE,則找到 1000 個停用的組)。這是預計的,共有10,000個組。
但是當我添加一個附加條件來檢查父母的狀態時(注意:這不需要是遞回的,在這個用例中組不能有“祖父母”):
(CASE
WHEN
g.activated_date is not null AND
g.activated_date < CURDATE()
THEN TRUE
WHEN
g.group_type = 'typeA'
THEN TRUE
WHEN
(g.parent.activated_date is not null AND g.parent.activated_date < CURDATE()) OR
(g.parent.group_type = 'typeA')
THEN TRUE
ELSE FALSE
END) = TRUE
然后我突然發現我有 8500 個激活組(和 750 個停用組)。我無法解釋丟失的 750 個組;我在做明顯錯誤的事情嗎?
uj5u.com熱心網友回復:
您的完整查詢不清楚,但如果 'g' 實體沒有父級,它們將從查詢結果中洗掉。您需要在此關系上使用左連接才能將它們包含在結果中。
"select <your select clause> where G g left join g.parent parent where <your Where clause>"
你在哪里使用 g.parent 在你的 select 或 where 子句中你只需要使用parent. 所以
(CASE
WHEN
g.activated_date is not null AND
g.activated_date < CURDATE()
THEN TRUE
WHEN
g.group_type = 'typeA'
THEN TRUE
WHEN
parent is not null AND
((parent.activated_date is not null AND parent.activated_date < CURDATE()) OR
(parent.group_type = 'typeA'))
THEN TRUE
ELSE FALSE
END) = TRUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473259.html
