SQL/HQL 查询:查找具有匹配某些参数的对象列表的对象

SQL/HQL Query: find object that has a list of objects that matchs some parameters

我有这些实体:

假设我收到这个 map<String,String>:

"gender": "male"

"age": "30"

我需要从地图 中找到具有包含所有这些key/values 的TargetGroup 的活动。 示例:

Map<String,String> keyValueParameters = new HashMap<String,String>();
keyValueParameters.put("gender","male");
keyValueParameters.put("age","30");

List<Campaign> campaignsResult = getCampaigns(keyValueParameters);
Campaign aCampaign = campaignsResult.get(someIndex);
TargetGroup aTargetGroup = aCampaign.getTargetGroup();
List<TargetValue> targetValues = aTargetGroup.getTargetValues();
targetValues.get(x).getKey() //"gender"
targetValues.get(x).getValue() //"male"
targetValues.get(y).getKey() //"age"
targetValues.get(y).getValue() //"30"
targetValues.get(z).getKey() //some other key

查询 returns 目标组列表,同时具有 key/value 对。 (条件 count

的 HAVING 部分中的 2
SELECT targetGroupID
FROM TargetGroup tg
     INNER JOIN TargetValue tv ON tg.targetGourpId=tv.targetGourpId
WHERE (tv.key='gender' and tv.value='male')
   OR (tv.key='age' and tv.value='30')
GROUP BY targetGroupID
HAVING COUNT(targetGroupID)>=2

然后我们可以使用上面的查询来获得合适的活动

SELECT * 
FROM Campaign c
     INNER JOIN (the select above) as sub ON c.targetGroupID=sub.targetGroupID

我几乎不可能使用纯休眠。 HAVING 可能是个问题。你可以尝试为此编写自己的hql。