4

user_activities列、user_idactivity_idおよびを含むテーブルがありますcommentsactivity_iduser_idは両方とも外部キーであり、アクティビティ テーブルには別の属性がありますactivity_name。特定の行をフェッチするには、user_idactivity_nameを使用できます。

FROM UserActivityMapping AS mapping
    INNER JOIN mapping.activityId AS activity
    WHERE userId = <something> AND activity.activityName = <something>

ここまでは順調ですね。Pairここで、の のリストが与えられた<UserId, ActivityName>ので、そのような行をすべて削除したいと思います。このリストは非常に大きくなる可能性があります.. 600-700 アイテムのように大きい. 今のところ、私が生成できるクエリの大きな混乱のように見えます:

DELETE ...
    WHERE (userId = userId[0] AND activity.activityName = activityName[0]) OR
          (userId = userId[1] AND activity.activityName = activityName[1]) OR
          ...

ここでは明らかに最善のアプローチではありません。どうすればいいですか?このようなものは素晴らしいでしょう:

"WHERE (userId, activityId) in :userActivityList".setParameterList(
    new List<Pair<String, String>>()
);

どんな助けでも大歓迎です。

4

1 に答える 1

0

以前に同様の問題に遭遇し、hql を動的に構築するためのかなり単純な関数を作成しました。

private String buildInClause(List<Integer> keys)  {
   String inClause = "object.id in (";
   for (Integer key : keys) {
     inClause += key + ',";
   }
   inClause = inClause.substring(0,inClause.length -1) + ")";  // strip off last comma and add a closing paren.
   return inClause;
}

あなたの問題のために、このアプローチをわずかに変更することができます

inClause = " userId || '-' || activity.activityName in (";

// loop over your pairs however they are passed in
inClause += "'" + userId + "-" + activityName + "',";
// strip off trailing coman and add closing paren
inClause = inClause.substring(0,inClause.length -1) + ")";  
// end loop
于 2014-03-04T17:49:21.857 に答える