Java Hibernate条件/Oracle-加入-仅当所有关联数据符合条件时返回

Java Hibernate条件/Oracle-加入-仅当所有关联数据符合条件时返回,java,sql,oracle,hibernate,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关

我有以下(近似)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标准构建的,但是我也非常乐意看到用于此的SQL,不需要了解Java


那么,这是可行的吗?

我认为你可以通过
拥有
子句来做你想做的事:

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;
选择eeg.equipment\u设备组
来自设备组eeg加入
设备e
关于eeg.equipment\u id=e.equipment\u id
按eeg分组。设备组
具有总和(当e.equipment_model_id'Y'然后1 else 0 end)=0;
having
子句计算设备型号不在列表中的情况。
=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中的一个问题。

您想要SQL中的答案吗?@GordonLinoff SQL或JPA标准,任何最适合您的标准。谢谢你,伙计!我想可能有用!如果我需要添加其他联接怎么办?我应该如何更新HAVING子句?例如,如果我想按型号和品牌过滤?@gustavaramos。通过
连接的附加子句也是同样的逻辑。这非常有意义。。。我真丢脸。嗯,我有个借口,凌晨一点就到了我明天早上第一件事就是测试这个,然后告诉你结果。干杯