Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果所有子记录中的字段相同,如何选择字段值_Java_Sql_Oracle_Select - Fatal编程技术网

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

Java 如果所有子记录中的字段相同,如何选择字段值,java,sql,oracle,select,Java,Sql,Oracle,Select,我不知道我对这个问题的措辞是否正确,但问题来了 这是一个使用java、oracle和hibernate的web应用程序 我有两个表处于一(项)对多(任务)关系中 项目 项目id名称 活动状态 等 任务 任务id 项目编号 活动状态 进展情况 等 项目的状态由其所有任务的状态组成。这是逻辑 如果项目状态为取消或保留…返回项目活动状态 如果没有任务,则返回“已完成” 如果所有任务都处于活动状态且未被取代,则 …如果未启动所有任务,则返回“未启动” …如果所有任务都已完成,则返回“已完成”

我不知道我对这个问题的措辞是否正确,但问题来了

这是一个使用java、oracle和hibernate的web应用程序

我有两个表处于一(项)对多(任务)关系中

项目

  • 项目id名称
  • 活动状态
任务

  • 任务id
  • 项目编号
  • 活动状态
  • 进展情况
项目的状态由其所有任务的状态组成。这是逻辑

  • 如果项目状态为取消或保留…返回项目活动状态
  • 如果没有任务,则返回“已完成”
  • 如果所有任务都处于活动状态且未被取代,则
  • …如果未启动所有任务,则返回“未启动”
  • …如果所有任务都已完成,则返回“已完成”
  • …如果所有任务都处于暂停状态,则返回暂停状态
  • 否则返回开始
我想使用SQL来实现这一点,并将其映射到hibernate映射文件中的一个字段

在过去的几天里,我尝试了很多方法,但似乎都无法奏效。我尝试对记录进行分组,如果找到一条记录,则返回该状态。我用过解码器、箱子等

下面是一些我尝试过的例子。在第二个示例中,我得到一个“非单个组函数”错误

有什么想法吗

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调试以查看生成了什么)。如果速度可以接受,那么我想这没关系,但请记住它不会很好地扩展。