[英]How to select the field value if field in all child records are the same
我不知道我是否正確地表達了這個問題,但是到了。
這是一個使用java,oracle,hibernate的Web應用程序。
我在一個(項目)對許多(任務)的關系中有2個表。
物品
任務
該項目的狀態由其所有任務的狀態組成。 這是邏輯……
我想使用SQL並將其映射到休眠映射文件中的字段中。
在過去的幾天里,我已經嘗試了很多事情,但似乎無法使其正常工作。 我嘗試對記錄進行分組,如果找到1條記錄,則返回該狀態。 我用過解碼,大小寫等
這是我嘗試過的一些例子。 在第二個示例中,我收到“不是單個組組函數”錯誤。
有什么想法嗎?
select decode(i.active_status_id, 'OH', i.active_status_id, 'Ca', i.active_status_id,t.progress_status_id)
from tasks t
LEFT OUTER JOIN Items i
ON i.item_id = t.item_id
where t.item_id = 10927815 and t.active_status_id = 'Ac' and t.active_status_id != 'Su'
group by i.active_status_id, t.progress_status_id;
select case
when (count(*) = 1) then progress_status_id
else 'St'
end
from
(select progress_status_id
from tasks t
where t.item_id = 10927815 and (t.active_status_id = 'Ac' and t.active_status_id != 'Su') group by t.progress_status_id)
也許是這樣的
SELECT
item_id
, CASE
WHEN active_status IN ('Canceled', 'On Hold') THEN active_status
WHEN t_num = 0 THEN 'Completed'
WHEN flag_all_active = 1 AND flag_all_not_started = 1 THEN 'Not Started'
WHEN flag_all_active = 1 AND flag_all_completed = 1 THEN 'Completed'
WHEN flag_all_active = 1 AND flag_all_on_hold = 1 THEN 'On Hold'
ELSE 'Started'
END
FROM
(
SELECT
i.item_id
, i.active_status
, sum(CASE WHEN t.task_id is NULL THEN 0 ELSE 1 end ) as t_num
, MIN( CASE t.active_status WHEN 'Ac' THEN 1 ELSE 0 END ) as flag_all_active
, MIN( CASE t.progress_status_id WHEN 'Not Starten' THEN 1 ELSE 0 END ) as flag_all_not_started
, MIN( CASE t.progress_status_id WHEN 'Completed' THEN 1 ELSE 0 END ) as flag_all_completed
, MIN( CASE t.progress_status_id WHEN 'On Hold' THEN 1 ELSE 0 END ) as flag_all_on_hold
FROM
items i
left outer join tasks t on (t.item_id = i.item_id )
group by i.item_id
)
;
如果使用批注,則可以將@Formula("sql query here")
用於派生屬性。 請參閱Hibernate公式文檔以獲取(令人驚訝的簡短)解釋。
另外,由於您要處理的項目列表相對較大,因此最好將狀態計算作為初始查詢的一部分,從而避免數據庫受到成百上千個請求的影響。 如果您遍歷列表中的每個項目,可能會發生這種情況。
我建議將狀態計算加入到用於生成列表的任何查詢中(大概在NamedQuery中)。 這樣一來,您的數據庫就可以完成所有繁重的工作,而不會因為網絡速度而減慢,這是最好的選擇。 Hibernate文檔提供了許多有用的查詢示例,您可以嘗試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.