繁体   English   中英

如果所有子记录中的字段都相同,如何选择字段值

[英]How to select the field value if field in all child records are the same

我不知道我是否正确地表达了这个问题,但是到了。

这是一个使用java,oracle,hibernate的Web应用程序。

我在一个(项目)对许多(任务)的关系中有2个表。

物品

  • item_id名称
  • active_status
  • 等等

任务

  • task_id
  • item_id
  • active_status
  • progress_status
  • 等等

该项目的状态由其所有任务的状态组成。 这是逻辑……

  • 如果项目状态被取消或处于保留中...返回项目活动状态
  • 如果没有任务,则返回已完成
  • 如果所有任务都处于活动状态并且未被取代,则
  • ...如果未启动所有任务,则返回未启动
  • ...如果所有任务均已完成,则返回已完成
  • ...如果所有任务都处于保留状态,则返回保留状态
  • 否则返回Started

我想使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM