Hibernate Criteria / Oracle - Join - 仅当所有关联数据符合条件时返回

时间:2014-11-10 01:48:51

标签: java sql oracle hibernate

我有以下(近似)SQL架构:

brand         model        equipment
brand_id      model_id     equipment_id
brand_name    model_name   equipment_nickname
                           equipment_brand_id
                           equipment_model_id

然后我在设备和设备组之间建立了N-N关系,如下所示:

equipment <----> equipment_equipment_group <----> equipment_group

因此,一个设备可以属于不同的组和所有的shebang。

事实上,这件事的过滤条件对我来说有点奇怪。如果组中的每个设备填满条件,我将只返回任何条件。

例如:我可以在一个组中拥有10个品牌X和20个品牌Y设备。在另一组我只有30个品牌Y设备。如果我按品牌Y过滤我的设备,则只会过滤第二组,因为其中的每个设备都符合我的标准。

我正在使用Hibernate Criteria来构建它,但是我也很高兴看到这个SQL,不需要在这个上知道Java。

那么,这可行吗?

2 个答案:

答案 0 :(得分:0)

我认为你可以用having子句做你想做的事情:

select eeg.equipment_equipment_group
from equipment_equipment_group eeg join
     equipment e
     on eeg.equipment_id = e.equipment_id
group by eeg.equipment_equipment_group
having sum(case when e.equipment_model_id <> 'Y' then 1 else 0 end) = 0;

having子句计算设备模型不在列表中的情况。 = 0表示没有发生这种情况的情况。

我省略了一些额外的连接(到brandmodel)以专注于逻辑。

答案 1 :(得分:0)

诀窍是首先检查组的条件,然后检查该组的总结果是否等于组中的产品总数。类似的东西:

SELECT * FROM equipment
INNER JOIN equipment_equipment_group ON 
  equipment_equipment_group.equipment_id = equipment.equipment_id 
INNER JOIN equipment_group ON 
  equipment_equipment_group.equipment_group_id = equipment_group.equipment_group_id
INNER JOIN 
  (SELECT COUNT(*) as cnt, equipment_equipment_group.equipment_group_id FROM equipment 
   INNER JOIN equipment_equipment_group ON 
     equipment_equipment_group.equipment_id = equipment.equipment_id 
   WHERE 
     -- Whatever conditions
     equipment.equipment_brand_id = 1
   GROUP BY
     equipment_equipment_group.equipment_group_id) AS equip_match ON 
  equipment_equipment_group.equipment_group_id = equip_match.equipment_group_id AND
  -- Only if then nb of equipment returned by subquery equals the total number of equipment in the group
  equip_match.cnt = (SELECT COUNT(*) FROM equipment_equipment_group as eqg WHERE eqg.equipment_group_id = equip_match.equipment_group_id)   

这是MySQL中的fiddle