Java 如果所有子记录中的字段相同,如何选择字段值
我不知道我对这个问题的措辞是否正确,但问题来了 这是一个使用java、oracle和hibernate的web应用程序 我有两个表处于一(项)对多(任务)关系中 项目Java 如果所有子记录中的字段相同,如何选择字段值,java,sql,oracle,select,Java,Sql,Oracle,Select,我不知道我对这个问题的措辞是否正确,但问题来了 这是一个使用java、oracle和hibernate的web应用程序 我有两个表处于一(项)对多(任务)关系中 项目 项目id名称 活动状态 等 任务 任务id 项目编号 活动状态 进展情况 等 项目的状态由其所有任务的状态组成。这是逻辑 如果项目状态为取消或保留…返回项目活动状态 如果没有任务,则返回“已完成” 如果所有任务都处于活动状态且未被取代,则 …如果未启动所有任务,则返回“未启动” …如果所有任务都已完成,则返回“已完成”
- 项目id名称
- 活动状态
- 等
- 任务id
- 项目编号
- 活动状态
- 进展情况
- 等
- 如果项目状态为取消或保留…返回项目活动状态
- 如果没有任务,则返回“已完成”
- 如果所有任务都处于活动状态且未被取代,则
- …如果未启动所有任务,则返回“未启动”
- …如果所有任务都已完成,则返回“已完成”
- …如果所有任务都处于暂停状态,则返回暂停状态
- 否则返回开始
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查询”)
。
请参阅以获得(令人惊讶的简短)解释
或者,由于您处理的是相对较大的项目列表,因此最好将状态计算作为初始查询的一部分,从而避免数据库受到数百或数千个请求的影响。如果迭代列表中的每个项目,可能会发生这种情况
我建议将状态计算加入到用于生成列表的任何查询中(可能是在NamedQuery中)。这使您的数据库能够完成所有繁重的工作,而不会被网络拖慢,这正是它最擅长的。提供了许多可以尝试的有用查询示例。您的方法取决于您的web应用程序是逐项访问,还是使用项目列表(以及这些列表的大小)…它将是项目列表,并且是逐项访问。有一个主页,列出所有项目(最多1000个)。用户可以单击以输入项目详细信息。现在任务在hibernate映射文件中被延迟加载(batch=select)。当前使用迭代器检索此状态。使用ehcache缓存状态值。如果该值存在于缓存中,则使用它,否则,对状态进行迭代和计数以确定项状态。我没有使用注释,但我会在映射文件中使用公式(可能在发布sql schurik时),例如:
您必须测试它,以查看它是否为每个项生成查询(打开sql调试以查看生成了什么)。如果速度可以接受,那么我想这没关系,但请记住它不会很好地扩展。